為什麼需要 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/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
轉換的方式有所不同。下表說明這些差異。
轉換為 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 |