【问题标题】:How can I check that the trademark(™) character is set correctly in my Oracle database?如何检查我的 Oracle 数据库中的商标 (™) 字符是否设置正确?
【发布时间】:2023-03-14 20:10:02
【问题描述】:

如何检查我的 Oracle 数据库中的商标 (™) 字符是否设置正确?

我希望它使用 UTF-8 编码存储。

我有一个值存储在 Salesforce.com 字段中,从 GUI 看起来像这样(注意商标字符):

Chuck Norris's Roundhouse Kick™

我正在使用 Informatica 将其复制到 Oracle 数据库。我的数据库设置为使用 AL32UTF8 编码。

它在 SQL Developer 中的显示方式

当我使用 SQL Developer 查询我的表时,商标符号显示为 一个矩形(黑色边框,白色填充)。

它在 HTML 中的显示方式

当我使用 UTF-8 编码从 SQL Developer 将其导出为 HTML 文档并在 Chrome 中打开时,商标符号根本不出现。当我在 IE 中打开它时,它再次显示为一个矩形。在 Firefox 中,它是一个矩形,上半部分是 00,下半部分是 99。所有三个浏览器都使用 UTF-8 解释 HTML 文档。

它在文本编辑器中的显示方式

在 Notepad 和 Notepad++ 中打开相同的 HTML 文档,商标符号显示为一个矩形。如果我使用 Notepad++ 的 Hex Viewer 插件,我看到字节编码是C2 99。那似乎是correct encoding for the trademark symbol in UTF-8

当我在 MS Write 中打开文档时,商标字符如下所示:™

当我以编程方式获取值时

使用 Python,当我从数据库中获取值时,商标字符被替换为 '\xbf' -- the inverted question mark,但是 那个 字符甚至没有正确编码,因为我可以分辨,因为它至少缺少一个前导字节(取决于具体的编码)

>>> import cx_Oracle
>>> con = cx_Oracle.connect('username', 'password', 'db')
>>> cur = con.cursor()
>>> cur.execute('select * from trademark')
<__builtin__.OracleCursor on <cx_Oracle.Connection to username@db>>
>>> records = cur.fetchall()
>>> records[0][0]
"Chuck Norris's Roundhouse Kick\xbf"

理想情况下,我希望能够使用上述所有方法验证存储在我的 Oracle 数据库中的数据。我会满足于有人只是验证我在 Hex Viewer 中看到的内容足以进行“测试”;)

【问题讨论】:

  • 代码 0x99 是 Windows 1252 代码页中的商标符号。还有其他几个。您在该 dbase 中找到的任何内容都没有以 utf-8 编码。 en.wikipedia.org/wiki/Code_page_1252

标签: unicode utf-8 character-encoding


【解决方案1】:

您发布的字符文字 ™ 不是 U+0099(控制字符),而是 U+2122(商标符号)。

Unicode 规范definesU+0099 如下:

0099;<control>;Cc;0;BN;;;;;N;;;;;

所以,它甚至没有名字,我也没有去挖掘规范来找出这个角色的用途。

在 Windows 中解码 U+0099 确实会产生商标字素。我想这是一个错误。

UTF-8 中商标符号 (U+2122) 的正确字节序列是 E2 84 A2

【讨论】:

  • 你是对的。当 Informatica 将值写入数据库时​​,该值未正确编码。从我自己的测试程序中写入值,我能够检索到商标符号。我们正在调查写入中出了什么问题,或者在写入之前对值的处理。
  • 由于 U+2122 在 windows-1252 中编码为 0x99,我猜想在某些转码操作中使用了默认的“ANSI”编码。
【解决方案2】:

仅供将来参考,因为作者没有费心发布修复程序。 确实是Informatica的问题,需要什么:

  1. 在 Informatica 框中更改 odbc.ini 中的连接属性,将“IANAAppCodePage=106”添加到需要 UTF8 的连接中。
  2. 在 Informatica 本身中更改连接的连接属性,并在“连接管理器 -> 连接 -> 关系 -> -> 编辑”中添加“Codepage=Utf-8”

【讨论】:

    【解决方案3】:

    如果您将此字符串保存为 html 文档中的输出,请使用:&amp;trade; 商标符号的 html 实体。

    如果您将此字符串用于非 html 目的,请在运行时解码该字符串:

    import HTMLParser
    h = HTMLParser.HTMLParser()
    s = h.unescape('&trade;')
    

    见: http://www.w3schools.com/html/html_entities.asp http://fredericiana.com/2010/10/08/decoding-html-entities-to-text-in-python/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 2018-07-29
      • 2012-10-15
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多