为什么需要 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/gg674964NEC 选定 - IBM 扩展字符(前导字节
0xED和0xEE)https://msdn.microsoft.com/en-us/goglobal/gg671837 https://msdn.microsoft.com/en-us/goglobal/gg671838IBM 选定字符(前导字节
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 |