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