10.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
extensions。
例如,在日语 Windows 环境中使用的“ SHIFT JIS”是 MicrosoftextensionsShift_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
时,必须选择一个代码点。对于此“往返转换”,使用 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处显示的 table 提供有关cp932
个字符的 Unicode 值的信息。对于带有字符的cp932
table 条目,其下出现一个四位数的数字,该数字 table 示相应的 Unicode(ucs2
)编码。对于带有带下划线的两位数字值的 table 条目,存在以该两位数字开头的cp932
字符值范围。单击此类 table 条目将带您到一个页面,该页面显示以这些数字开头的每个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
之间的转换是不同的。下 table 说明了这些差异。
转换为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 |
任何日语字符集的用户都应注意,使用--character-set-client-handshake(或--skip-character-set-client-handshake)具有重要的作用。参见第 5.1.6 节“服务器命令选项”。