【问题标题】:Get non-ASCII character from single character code从单字符代码中获取非 ASCII 字符
【发布时间】:2014-10-15 19:15:14
【问题描述】:

我有几个 NLS 字符编码不同的数据库。一种使用AL32UTF8 (UTF-8),另一种使用WE8MSWIN1252 (Windows 1252)。是的,这很糟糕,我会推动把事情理顺,这样它们就一样了。同时,我需要编写一些包含非 ASCII 字符的 SQL。例如,我需要使用 á,即 Unicode 中的 U+00E1。在 UTF-8 中,它用十六进制值 0xC3A1 表示,而在 Windows 1252 中,它用十六进制值 0x00E1 表示。 (换句话说,这些是字节值。)

所以这给了我想要的 UTF-8 数据库:

SELECT CHR(TO_NUMBER('C3A1', 'xxxx')) FROM DUAL;

这给了我我想要的 Windows 1252 数据库:

SELECT CHR(TO_NUMBER('00E1', 'xxxx')) FROM DUAL;

不过,我似乎无法找到一种方法让 Oracle 只接受一个并将其转换为正确的编码。我真的不在乎我最终使用哪种表示。我只想使用一个十六进制值,因为需要在两个数据库上运行相同的脚本。我该怎么做?

使用 Oracle 11g。 (不幸的是,一个是 11.1,另一个是 11.2。)

【问题讨论】:

    标签: oracle utf-8 character-encoding windows-1252


    【解决方案1】:

    UNISTR和TO_CHAR有两个函数可以帮忙:

    1. 以数据库的国家字符集返回:

       SELECT UNISTR('\00E1') FROM DUAL;
      
    2. 在数据库字符集中返回:

       SELECT TO_CHAR(UNISTR('\00E1')) FROM DUAL;
      

    From UNISTR documentation:

    UNISTR 将文本文字或解析为字符数据并以国家字符集返回的表达式作为其参数。数据库的国家字符集可以是 AL16UTF16 或 UTF8。 UNISTR 通过让您指定字符串中字符的 Unicode 编码值来提供对 Unicode 字符串文字的支持。例如,这对于将数据插入 NCHAR 列很有用。

    Unicode 编码值的格式为“\xxxx”,其中“xxxx”是 UCS-2 编码格式的字符的十六进制值。补充字符被编码为两个代码单元,第一个来自高代理范围(U+D800 到 U+DBFF),第二个来自低代理范围(U+DC00 到 U+DFFF)。要在字符串本身中包含反斜杠,请在其前面加上另一个反斜杠 (\)。

    为了可移植性和数据保存,Oracle 建议在 UNISTR 字符串参数中仅指定 ASCII 字符和 Unicode 编码值。

    From TO_CHAR(character) documenation:

    TO_CHAR(character) 将 NCHAR、NVARCHAR2、CLOB 或 NCLOB 数据转换为数据库字符集。返回的值始终是 VARCHAR2。

    【讨论】:

    • 哦,天哪。这比我想出的那些破旧的垃圾要好得多。谢谢!为了检查我的理解,我通过传入一个 ASCII 字符串来使用UNISTR,该字符串可能包含转义的 Unicode 代码点。然后它以国家编码输出一个字符串。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多