为什么需要 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 扩展,其确切名称是 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
时,必须选择其中一个代码点。对于这种 “往返转换,” 使用 Microsoft 推荐的规则。(参见 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 特殊字符(前导字节
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。
对于某些字符,sjis
和 cp932
对 ucs2
的转换有所不同。下表说明了这些差异。
转换为 ucs2
sjis /cp932 值 |
sjis -> ucs2 转换 |
cp932 -> ucs2 转换 |
---|---|---|
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 值 |
ucs2 -> sjis 转换 |
ucs2 -> cp932 转换 |
---|---|---|
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 |