为什么需要 cp932
?
在 MySQL 中,sjis
字符集对应 IANA 定义的 Shift_JIS
字符集,支持 JIS X0201 和 JIS X0208 字符。(见 http://www.iana.org/assignments/character-sets。)
然而,"SHIFT JIS" 这个描述性术语的含义变得非常模糊,经常包括各种供应商对 Shift_JIS
的扩展。
例如,在日本 Windows 环境中使用的 "SHIFT JIS" 是 Microsoft 对 Shift_JIS
的扩展,其确切名称是 Microsoft Windows Codepage : 932
或 cp932
。除了支持 Shift_JIS
字符集外,cp932
还支持 NEC 特殊字符、NEC 选择—IBM 扩展字符和 IBM 选择字符。
许多日本用户曾经遇到过使用这些扩展字符的问题。这些问题来自以下几个因素:
-
MySQL 自动转换字符集。
-
字符集使用 Unicode (
ucs2
) 转换。 -
sjis
字符集不支持这些扩展字符的转换。 -
有多种从所谓 "SHIFT JIS" 到 Unicode 的转换规则,一些字符根据转换规则不同地转换为 Unicode。MySQL 只支持其中的一种规则(后面将描述)。
MySQL 的 cp932
字符集旨在解决这些问题。
由于 MySQL 支持字符集转换,因此将 IANA 的 Shift_JIS
和 cp932
分别作为两个不同的字符集,因为它们提供了不同的转换规则。
cp932
与 sjis
有何不同?
cp932
字符集与 sjis
的不同之处在于:
-
cp932
支持 NEC 特殊字符、NEC 选择—IBM 扩展字符和 IBM 选择字符。 -
一些
cp932
字符具有两个不同的代码点,这两个代码点都将转换为同一个 Unicode 代码点。在从 Unicode 转换回cp932
时,必须选择其中一个代码点。对于这种““圆trip 转换,”” 微软推荐的规则将被使用。(见 http://support.microsoft.com/kb/170559/EN-US/。)转换规则如下所示:
-
如果字符同时在 JIS X 0208 和 NEC 特殊字符中,使用 JIS X 0208 的代码点。
-
如果字符同时在 NEC 特殊字符和 IBM 选定字符中,使用 NEC 特殊字符的代码点。
-
如果字符同时在 IBM 选定字符和 NEC 选定—IBM 扩展字符中,使用 IBM 扩展字符的代码点。
表格 https://msdn.microsoft.com/en-us/goglobal/cc305152.aspx 提供了
cp932
字符的 Unicode 值信息。对于cp932
表条目中带有四位数字的字符,数字表示对应的 Unicode (ucs2
) 编码。对于表条目中带有下划线的两位值,表示cp932
字符值的范围,以这些数字开头。点击这样的表条目将显示每个cp932
字符的 Unicode 值。以下链接非常重要。它们对应于以下字符集的编码:
-
NEC 特殊字符(lead byte
0x87
):https://msdn.microsoft.com/en-us/goglobal/gg674964
-
NEC 选定—IBM 扩展字符(lead byte
0xED
和0xEE
):https://msdn.microsoft.com/en-us/goglobal/gg671837 https://msdn.microsoft.com/en-us/goglobal/gg671838
-
IBM 选定字符(lead byte
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
到 cp932
的转换不同于 sjis
和 cp932
。以下表格说明了这些差异。
转换到 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 | £ | ǵ |
81CA | ¬ | ǵ |
从 ucs2
转换:
ucs2 value |
ucs2 -> sjis Conversion |
ucs2 -> cp932 Conversion |
---|---|---|
005C | 低 surrogate | \ |
007E | ~ | ~ |
00A2 | 高 surrogate | ? |
00A3 | 补充字符 | ? |
00AC | ? | ? |
2015 | 低 surrogate | 低 surrogate |
2016 | ? | ? |
2212 | ? | ? |
2225 | ? | ? |
301C | ? | ? |
FF0D | ? | ? |
FF3C | ? | 低 surrogate |
FF5E | ? | ? |
FFE0 | ? | 高 surrogate |
FFE1 | ? | 补充字符 |
FFE2 | ? | ? |