12.10.7.1 cp932 字符集
为什么需要cp932
?
在 MySQL 中,sjis
字符集对应于 IANA 定义的 Shift_JIS
字符集,该字符集支持 JIS X0201 和 JIS X0208 字符。 (参见http://www.iana.org/assignments/character-sets。)
然而,“SHIFT JIS” 作为描述性术语的含义变得非常模糊,常常包括各种厂商对 Shift_JIS
的扩展定义。
例如,在日本 Windows 环境中使用的 “SHIFT JIS” 是微软对 Shift_JIS
的扩展,具体名称是 Microsoft Windows Codepage : 932
或 cp932
。此外,cp932
还支持 NEC 特殊字符、NEC 选定的—IBM 扩展字符和 IBM 选定的字符。
许多日本用户曾经遇到使用这些扩展字符的问题。这些建议来自以下因素:
-
MySQL 自动将字符集转换。
-
字符集使用 Unicode (
ucs2
) 进行转换。 -
sjis
字符集不支持这些扩展字符的转换。 -
从所谓的““SHIFT JIS””到 Unicode,有多种转换规则,某些字符根据转换规则不同地被转换。MySQL 只支持其中的一种(后面描述)。
MySQL 的 cp932
字符集旨在解决这些问题。
因为 MySQL 支持字符集转换,所以需要将 IANA Shift_JIS
和 cp932
分别作为两个不同的字符集,因为它们提供不同的转换规则。
cp932
和 sjis
之间的差异?
cp932
字符集与 sjis
在以下方面不同:
-
cp932
支持 NEC 特殊字符、NEC 选定的—IBM 扩展字符和 IBM 选定的字符。 -
某些
cp932
字符有两个不同的代码点,都是转换到同一个 Unicode 代码点。从 Unicode 回转到cp932
时,必须选择其中一个代码点。对于这个““回环转换,””,微软推荐的规则被使用。(见http://support.microsoft.com/kb/170559/EN-US/。)转换规则如下:
-
如果字符在 JIS X 0208 和 NEC 特殊字符中,使用 JIS X 0208 的代码点。
-
如果字符在 NEC 特殊字符和 IBM 选定的字符中,使用 NEC 特殊字符的代码点。
-
如果字符同时在IBM选择字符和NEC选择字符中,使用IBM扩展字符的代码点。
https://msdn.microsoft.com/en-us/goglobal/cc305152.aspx 表中提供了
cp932
字符的 Unicode 值信息。对于表项中出现四位数字的字符,数字表示对应的 Unicode (ucs2
) 编码。对于表项中出现下划线两位值的字符,有一系列cp932
字符值从这些两位开始。点击这样的表项将你带到每个以这些数字开头的cp932
字符的 Unicode 值页面。以下链接特别有趣。它们对应于以下字符集的编码:
-
NEC 特殊字符(前字节
0x87
):https://msdn.microsoft.com/en-us/goglobal/gg674964
-
NEC 选择—IBM 扩展字符(前字节
0xED
和0xEE
):https://msdn.microsoft.com/en-us/goglobal/gg671837 https://msdn.microsoft.com/en-us/goglobal/gg671838
-
IBM 选择字符(前字节
0xFA
,0xFB
,0xFC
):https://msdn.microsoft.com/en-us/goglobal/gg671839 https://msdn.microsoft.com/en-us/goglobal/gg671840 https://msdn.microsoft.com/en-us/goglobal/gg671841
-
-
cp932
可以与eucjpms
组合使用,解决sjis
/ujis
转换问题。详细信息,请参阅http://www.sljfaq.org/afaq/encodings.html。
对于一些字符,转换到和从ucs2
不同于sjis
和cp932
。以下表格illustrate这些差异。
转换到ucs2
:
sjis /cp932 Value |
sjis -> ucs2 Conversion |
cp932 -> ucs2 Conversion |
---|---|---|
5C | 005C | 005C |
7E | 007E | 007E |
815C | 2015 | 2015 |
815F | 005C | FF3C |
8160 | 301C | FF5E |
8161 | 2016 | 2225 |
817C | 2212 | FF0D |
8191 | 00A2 | FFE0 |
8192 | 00A3 | FFE1 |
81CA | 00AC | FFE2 |
转换从ucs2
:
ucs2 value |
ucs2 -> sjis Conversion |
ucs2 -> cp932 Conversion |
---|---|---|
005C | 815F | 5C |
007E | 7E | 7E |
00A2 | 8191 | 3F |
00A3 | 8192 | 3F |
00AC | 81CA | 3F |
2015 | 815C | 815C |
2016 | 8161 | 3F |
2212 | 817C | 3F |
2225 | 3F | 8161 |
301C | 8160 | 3F |
FF0D | 3F | 817C |
FF3C | 3F | 815F |
FF5E | 3F | 8160 |
FFE0 | 3F | 8191 |
FFE1 | 3F | 8192 |
FFE2 | 3F | 81CA |