为什么需要 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 |