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

时间:2011-09-07 22:31:55

标签: unicode utf-8 character-encoding

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

我希望它使用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 ++中打开相同的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中看到的内容足够“测试”;)

3 个答案:

答案 0 :(得分:6)

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

Unicode规范defines U + 0099如下:

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

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

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

UTF-8中TRADE MARK SIGN(U + 2122)的正确字节序列为E2 84 A2

答案 1 :(得分:2)

仅供将来参考,因为作者没有打扰发布修复程序。 它确实是一个Informatica问题,需要什么:

  1. 在Informatica框中的odbc.ini中更改连接属性,添加&#34; IANAAppCodePage = 106&#34;到需要UTF8的连接。
  2. 在Informatica中更改连接的连接属性并添加&#34; Codepage = Utf-8&#34;在&#34;连接管理器 - &gt;连接 - &gt;关系 - &gt; - &GT;编辑&#34;

答案 2 :(得分:0)

如果要在html doc中保存此字符串以输出,请使用:&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/