charset-cp932.zh.md 4.9 KB
Newer Older
茶陵後's avatar
茶陵後 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
#### 10.10.7.1 cp932 字符集

**为什么是`cp932`需要吗?**

在 MySQL 中,`sjis`字符集对应`Shift_JIS`IANA 定义的字符集,支持 JIS X0201 和 JIS X0208 字符。(看<http://www.iana.org/assignments/character-sets>.)

然而,“SHIFT JIS”作为描述性术语的含义已经变得非常模糊,它通常包括对`Shift_JIS`由不同的供应商定义。

例如,日文 Windows 环境中使用的“SHIFT JIS”是 Microsoft 对`Shift_JIS`它的确切名称是`Microsoft Windows 代码页: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>提供有关 Unicode 值的信息`cp932`人物。为了`cp932`带有字符的表条目,其下出现一个四位数的数字,该数字代表相应的 Unicode (`ucs2`) 编码。对于带有下划线的两位数值的表格条目,有一个范围`cp932`以这两位数字开头的字符值。单击此类表条目会将您带到一个页面,该页面显示每个表的 Unicode 值`cp932`以这些数字开头的字符。

        以下链接特别有趣。它们对应于以下字符集的编码:

    -   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`/`乌吉斯`转换。详情请参阅<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 | 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 | 815 楼 | 生菜 |
| 007 | H | H |
| 00一 | 8191 | 打扰一下 |
| 00 | 8192 | 打扰一下 |
| 00S | 81 | 打扰一下 |
| 2015 | 815 | 815 |
| 2016 年 | 8161 | 打扰一下 |
| 2212 | 817 | 打扰一下 |
| 2225 | 打扰一下 | 8161 |
| 301s | 8160 | 打扰一下 |
| FF0D | 3F | 817C |
| FF3C | 3F | 815F |
| FF5E | 3F | 8160 |
| FFE0 | 3F | 8191 |
| FFE1 | 3F | 8192 |
| FFE2 | 3F | 81CA |

任何日文字符集的用户都应该知道,使用[`--character-set-client-handshake`](server-options.html#option_mysqld_character-set-client-handshake)(要么[`--skip-character-set-client-handshake`](server-options.html#option_mysqld_character-set-client-handshake)) 有重要作用。看[第 5.1.7 节,“服务器命令选项”](server-options.html).