為什麼需要 cp932?
在 MySQL 中,sjis 字元集對應於 IANA 定義的 Shift_JIS 字元集,它支援 JIS X0201 和 JIS X0208 字元。(請參閱 http://www.iana.org/assignments/character-sets。)
然而,「SHIFT JIS」作為一個描述性詞語的意義已經變得非常模糊,而且它經常包括各個廠商對 Shift_JIS 的擴充。
例如,在日本 Windows 環境中使用的「SHIFT JIS」是 Microsoft 對 Shift_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 中顯示的表格提供了有關
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 |