首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

日文字符中常见的乱码景况-正波浪线“~”

2012-08-29 
日文字符中常见的乱码情况---正波浪线“~”, SJIS这样的语句,其实也并非真的就把这个字符从MS932转换成了

日文字符中常见的乱码情况---正波浪线“~”
, "SJIS"日文字符中常见的乱码景况-正波浪线“~”;这样的语句,其实也并非真的就把这个字符从MS932转换成了SJIS编码形式,只不过是从一个Unicode(MS932编码的全角波浪线在Unicode中对应的字符)变成了SJIS编码的全角波浪线在Unicode中对应的字符,说白了,转换后还是个Unicode字符。

??????? 但是为什么仍然会出乱码呢?举个简单的例子,某个终端只接受SJIS编码的字符(目前好象还没有哪个终端支持Unicode吧?),如果你通过Java程序给它传了一个SJIS中该字符在Unicode中对应的字符,那么底层系统可以顺利地将之转换成正确的SJIS编码字符,于是这个终端也就可以正常显示该字符了;反之,如果你给了一个MS932中该字符在Unicode中对应的字符,而如果它恰好又是一个特殊字符(比如日文中的全角波浪线''~''),就会出现乱码(因为MS932编码的全角波浪线在Unicode中对应''\uff5e'',而SJIS编码的全角波浪线在Unicode中对应''\u301c''),示意如下:

''\uff5e''(Unicode,Java程序) -> ?(本地字符集SJIS,终端):NG。因为Unicode字符''\uff5e''并不对应SJIS字符集中的全角波浪线;
''\u301c''(Unicode,Java程序) -> ~(本地字符集SJIS,终端):OK。
??????? 另外,查看了一下Oracle的JDBC驱动(JDBC OCI driver)的说明,中间提到: "If NLS_LANG specifies a character set other than US7ASCII or WE8ISO8859P1, the driver uses UTF-8 as the client character set. This happens automatically and does not require any user intervention. OCI converts the data from the database character set to UTF-8. The JDBC OCI driver then passes the UTF-8 data to the JDBC Class Library, where the UTF-8 data is converted into UTF-16."那么,按照上面的说法,其实在从数据库取得的字符变成UTF-8时就已经是Unicode字符了,不过这里有一个值得注意的地方,即这个Unicode字符应该是该本地字符(比如在Oracle服务器的NSL_LANG中指定的EUCJIS)对应的Unicode字符,有些拗口吧?:-) 仍以日文中的全角波浪线为例(假设Oracle服务器的编码是EUCJIS),该转换过程就是:

?? ''~''(EUCJIS编码的全角波浪线,Oracle服务器端) -> EUCJIS编码的全角波浪线在UTF-8中对应的字符(UTF-8,经过OCI变换后) -> ''\u301c''(EUCJIS编码的全角波浪线在UTF-16中对应的字符,经过JDBC Class Library变换后)

??????? 最后,还有一个地方须要特别注意:那就是同一个本地字符向Unicode转换过程中,如果使用了不同的映射表,可能会得出不同的结果。以减号''-''(MINUS SIGN)从EUCJIS到Unicode的转换过程为例:

0xA1D0(MINUS SIGN/負符号,減算記号) -> ''\u2212''(MINUS SIGN) (使用x-eucjp-unicode-0.9映射表)
0xA1D0(MINUS SIGN/負符号,減算記号) -> ''\u2212''(MINUS SIGN) (使用x-eucjp-jisx0221-1995映射表)
0xA1D0(MINUS SIGN/負符号,減算記号) -> ''\uff0d''(FULLWIDTH HYPHEN-MINUS) (使用x-eucjp-open-19970715-ms映射表)

热点排行