优雅地从Unicode转换为单字节字符集

时间:2009-09-10 16:03:12

标签: oracle unicode plsql xmltype

我的数据库(10gR2)是单字节的(NLS_CHARACTERSET = WE8DEC)。

我有一个我想要解析的Unicode XML文件。如果我将文件读入CLOB并尝试将其转换为XMLType,则当XML包含特殊字符(在本例中为挪威字符,例如“øæå”)时,Oracle会发出ch咽声。

ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00216: invalid character 184 (0xB8)

如果我将文件读入NCLOB,然后使用TO_CLOB将其显式转换为CLOB,则XMLType构造函数会成功。但是,这种转换会产生“丑陋”的结果。例如,

bølle gjær

变为

bÿlle gjÿr

有什么方法可以执行从NCLOB到Unicode到单字节CLOB的转换,并且仍然保持特殊字符的完整性? (我对正确转换三个挪威字符“øæå”特别感兴趣,其他特殊符号和字符在这种情况下并不重要。)

3 个答案:

答案 0 :(得分:1)

可以使用字符引用重新编码那些不适合一个字节的字符。这可以通过查找将其放入引用的unicode值来完成。例如,A看起来像A

答案 1 :(得分:1)

TO_CLOB应该正确地从国家字符集转换为数据库字符集。如果可以映射所有字符,则不会有任何问题。

然后我怀疑你的问题发生在将文件读入NCLOB 部分。 Unicode 是一个相当模糊的信息:

  • XML文件通常以UTF-8字符集编码(带或不带Byte Order Mark)。
  • 默认情况下,国家字符集在Oracle上设置为UTF-16(AL16UTF16)。

需要进行特定转换才能从一个转换到另一个。您应首先确保包含XML文件的NCLOB具有正确的信息。

答案 2 :(得分:0)

我不知道您问题的确切答案,但这项技术对您来说非常有用。

这是我用于从字符集转换为另一个字符集的查询。

SELECT CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC')  
  FROM table

尝试:

NE8ISO8859P10 ISO 8859-10北欧

NEE8ISO8859P4 ISO 8859-4北欧和东北欧

page列出了Oracle 8i NLS设置