【问题标题】:Oracle WE8ISO8859P15 charset convert to utf8 in perl scriptOracle WE8ISO8859P15 字符集在 perl 脚本中转换为 utf8
【发布时间】:2012-08-31 07:42:22
【问题描述】:

首先,我有一个数据库,不允许我更改任何内容,因此我必须处理给定的字符集。

这是数据库的字符集:

SELECT * from NLS_DATABASE_PARAMETERS 
 WHERE parameter IN ( 'NLS_LANGUAGE', 'NLS_TERRITORY', 'NLS_CHARACTERSET');

NLS_LANGUAGE             GERMAN     
NLS_TERRITORY            GERMANY
NLS_CHARACTERSET         WE8ISO8859P15

在连接到这个数据库时(使用 perl),我将连接字符集设置为 WE8ISO8859P15。我认为到目前为止我做得对。 :)

现在是棘手的部分,它失败了。数据库中的数据需要转换为 utf8,才能在我使用数据的浏览器中正确显示。

据我了解,设置 NLS_LANG 应该为我处理这个问题?设置它时,它应该将WE8ISO8859P15 数据(即时)转换为utf8,对吧?

所以,在 perl 中建立连接之前,我将环境变量设置为

$ENV{'NLS_LANG'} = ".AL32UTF8"

但没有任何改变,我做错了吗?

当手动转换数据时,在 perl 脚本中是这样的:

Encode::from_to($data, 'iso-8859-15', 'utf8');

它按预期工作。

非常感谢您的帮助。

谢谢, 安迪

【问题讨论】:

  • 您要在数据库中存储哪些字符?您是否尝试将 ISO-8859-15 字符集中的无效字符存储在 CHARVARCHAR2CLOB 列中?
  • 它只是“普通”文本、数字和日期。所有存储的字符都是有效的 ISO-8859-15 字符。
  • 您是使用 DBI 还是假脱机 SQLPlus 输出并读入 perl?请注意,SQLPlus 不支持 UTF8,因此无法使用。
  • 我正在使用 DBI。顺便说一句,当我将连接直接设置为 utf8 时会发生什么?这是否可行,因为它没有。

标签: perl oracle utf-8 character-encoding


【解决方案1】:

我不是 perl 专家。但是NLS_LANG 参数通常需要类似于

NLS_LANG = GERMAN_GERMANY.AL32UTF8

不仅仅是AL32UTF8NLS_LANG 是否设置在您环境中的其他位置?还是 perl 脚本是唯一设置它的东西?

【讨论】:

  • 嗨贾斯汀,文档说它可以只在 NLS_LANG 中设置字符集,如下所示:“.AL32UTF8”(. 是必要的)。同样有效的是这样的:“_GERMANY.AL32UTF8”或这样的:“_GERMANY”。它仅由 perl 脚本在连接之前设置,以确保此时正确的环境处于活动状态。
猜你喜欢
  • 2020-02-06
  • 2020-11-08
  • 2013-03-28
  • 2016-01-12
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
相关资源
最近更新 更多