为什么cp932
需要?
在MySQL中,sjis字符集对应Shift_JISIANA定义的字符集,支持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 selected—IBM 扩展字符、IBM selected 字符。
许多日本用户在使用这些扩展字符时遇到问题。这些问题源于以下因素:
MySQL 自动转换字符集。
字符集使用 Unicode (
ucs2) 进行转换。sjis字符集不支持这些扩展字符的转换 。从所谓的 “ SHIFT JIS ”到 Unicode 的转换规则有几种,根据转换规则,某些字符转换为 Unicode 的方式也不同。MySQL 只支持这些规则之一(稍后描述)。
MySQLcp932字符集就是为了解决这些问题而设计的。
因为 MySQL 支持字符集转换,所以将 IANAShift_JIS和
cp932分成两个不同的字符集很重要,因为它们提供不同的转换规则。
与有何cp932不同?sjis
cp932字符集
在
以下sjis方面有所不同:
cp932支持 NEC 特殊字符、NEC selected—IBM 扩展字符和 IBM selected 字符。一些
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 中显示的表格 提供了有关字符的 Unicode 值的信息
cp932。对于cp932其下出现四位数字的字符的表条目,该数字表示相应的 Unicode (ucs2) 编码。对于带有带下划线的两位数值的表条目,存在cp932以这两位数开头的字符值范围。单击此类表条目会将您带到一个页面,该页面显示cp932以这些数字开头的每个字符的 Unicode 值。以下链接特别有趣。它们对应于以下字符集的编码:
NEC 特殊字符(前导字节
0x87):https://msdn.microsoft.com/en-us/goglobal/gg674964NEC selected—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。
对于某些字符,与 之间的相互转换
ucs2是不同
sjis的cp932。下表说明了这些差异。
转换为ucs2:
sjis/cp932值 |
sjis->ucs2转换 |
cp932->ucs2转换 |
|---|---|---|
| 5C | 005C | 005C |
| 7E | 007E | 007E |
| 815C | 2015年 | 2015年 |
| 815F | 005C | 最终幻想3 |
| 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 |
| 最终幻想3 | 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.7 节,“服务器命令选项”。