2012年1月16日 星期一

編碼與解碼

什麼是編碼與解碼

「碼」:將原本的資訊,以特別的代號來表示,只要知道每種代號的意義,就能以代號來獲知原本的資訊。 例如:._ _... _._. 就是摩斯電碼。還有像 ASCII, BIG5, UTF8 ... 都是一種「碼」。

  • 編碼(encoding):將一組 Unicode 字元轉換成位元組序列的處理程序。( string to byte[] )
  • 解碼(decoding):將已編碼的位元組序列轉換成一組 Unicode 字元的處理程序。( byte[] to string)

我們都知道,電腦中的文字,都必須使用某種編碼標準(encoding standard)進行編碼(encoding)後,才可以存放在記憶體或檔案中。只是這個編碼與解碼的過程,通常系統都會自動幫我們處理。 不過,有時候我們還是必須手動處理這個編碼與解碼的過程,例如:要將資料和Unix系統交換時,或者要以指定的編碼標準處理文字檔案等等。 其實,每一種編碼標準都是為了轉換 byte value 與 character。 就像 ASCII 就是一種老舊但也是最廣泛使用的編碼標準之一。 例如其中 0x41 = A, 0x61 = a ...。 不過,因為這個編碼標準對非英語系的支援非常有限,所以也就延伸出各種 Unicode 的編碼標準以支援各種語言。

每一種特定的語言,都存在一種或數種的字集碼,每一種字集碼就是一個代碼頁 ( code page )。 例如:big5 的 code page = 950,提供給繁體中文語系使用的編碼;Windows-1252 的 code page = 1252,提供給西歐的英語系使用;shift_jis 的 code page = 932,提供給日語中的漢字使用。 不過,這些表示 code page 的數字,是由不同的系統廠商自行定義的。例如:UTF-8 在 IBM 稱作代碼頁1208,在微軟稱作代碼頁65001,在 SAP 稱作代碼頁4110。 更詳細的字元編碼概念可參閱這篇說明:.NET Framework 中的字元編碼方式

有了各種字集碼,讓電腦系統有方法可以處理不同語系的文字,但卻無法在同一個文件裏面同時支援多個語系。 Unicode 是為了解決傳統的字元編碼方案的侷限所產生的一項業界標準。 它對世界上大部分的文字系統進行了整理、編碼,使得電腦可以用更為簡化的方式來呈現和處理文字。

Unicode

Unicode 本身並不具任何編碼型態,它可以說是所有 code page 的合成,包含大部分語言的字元。這張表含蓋的字集範圍介於 0 ~ 1114111 (0x10FFFF) 之間。 不過在現實生活中,沒有人會使用 Unicode 儲存資料,通常是是使用 UTF-8 或者 UTF-16 儲存資料。 在表示一個 Unicode 的字元時,通常會用「U+」然後緊接著一組十六進位的數字來表示這一個字元。例:U+0041表示「A」,U+0042表示「B」,U+E999表示「陳」。

UCS-2

UCS-2 使用16位的編碼空間,也就是每個字元佔用2個位元組。 這樣理論上一共最多可以表示216(即65536)個字元。基本滿足各種語言的使用。實際上目前版本的統一碼並未完全使用這16位編碼,而是保留了大量空間以作為特殊使用或將來擴展。 如果想查詢 Unicode 文字的編碼,可以利用 Unicode lookup 網站來查詢,一次可以輸入多個字並且可以一次幫你產生多種 Unicode 的表達形式。

UTF-8

UTF-8(8-bit Unicode Transformation Format)是一種針對 Unicode 的可變長度字元編碼。也就是每個字元的編碼至少一個byte,最多四個byte。 可以用來表示 Unicode 標準中的任何字元,且其編碼中的第一個位元組仍與ASCII相容,這使得原來處理ASCII字元的軟體無須或只須做少部分修改,即可繼續使用。 因此,它逐漸成為電子郵件、網頁及其他儲存或傳送文字的應用中,優先採用的編碼。
0~127:使用8-bit編碼,對應到 ASCII 。
128~2047:使用16-bit編碼,可支援 Latin, Greek, Cyrillic, Hebrew 等語言。
2048~65535:使用24-bit編碼,可支援 Chinese, Japanese,Korean 等語言。
65536~:使用32-bit編碼,其他需求語言。

BIG5

如果第一個 byte 是正數或零,那麼就確定是 ASCII 的字元。如果第一個 byte 是負數,就再讀一個 byte ,兩個 byte 當作為一個字元。

.Net Framework 系統中,預設使用 UTF-16 編碼型態來表示字元,在 System.Text 命名空間底下,同時還提供了幾種編碼與解碼的相關類別:

  • Unicode UTF-32:UTF32Encoding 類別,將每個字碼指標表示成 32 位元整數。
  • Unicode UTF-16:UnicodeEncoding 類別,將每個字碼指標表示成 16 位元整數。
  • Unicode UTF-8:UTF8Encoding 類別,將每個字碼指標表示成 1 到 4 個位元組,對應到 windows 的 code page = 65001。
  • UTF-7:UTF7Encoding 類別,將 Unicode 字元表示為 7 位元 ASCII 字元序列。
  • ASCII:ASCIIEncoding 類別,僅支援有限的字元集(U+0000~U+007F),對應到 Windows 字碼頁 20127。

任何經過 UTF-X 編碼的文字,最後都得解碼以還原到 Unicode 所對應數字,才知道它是哪一個字。

檢視編碼類型

.NET Framework 提供了 Encoding 類別,可以用來取得 Unicode 字元的編碼規則,或者將不同的編碼與 Unicode 進行轉換。 除了上述提及的幾種方法可以取得特定的編碼物件,另外,透過 Encoding.GetEncoding 則可以用來取得指定編碼方式的編碼物件。

Encoding e1 = Encoding.Default;                 // get default encoding
Encoding e2 = Encoding.GetEncoding(950);        // get big5 encoding
Encoding e3 = Encoding.GetEncoding("Korean");   // get koren encoding
Encoding e4 = Encoding.GetEncoding(65001);      // get utf-8 encoding

Console.WriteLine("CodePage : {0}", e1.CodePage);
Console.WriteLine("EncodingName : {0}", e1.EncodingName);
//CodePage : 950
//EncodingName : 繁體中文 (Big5)

Console.WriteLine("CodePage : {0}", e4.CodePage);
Console.WriteLine("EncodingName : {0}", e4.EncodingName);
//CodePage : 65001
//EncodingName : Unicode (UTF-8)
}
private void button10_Click(object sender, EventArgs e)
{
    string strContent = "ABCabc012你我他";

    //Default
    ShowCode(Encoding.Default.GetBytes(strContent));            //x41 x42 x43 x61 x62 x63 x30 x31 x32 xA7 x41 xA7 xDA xA5 x4C 

    //Big5 = Default
    ShowCode(Encoding.GetEncoding(950).GetBytes(strContent));   //x41 x42 x43 x61 x62 x63 x30 x31 x32 xA7 x41 xA7 xDA xA5 x4C   '繁體中文 (Big5)

    //GB2312
    ShowCode(Encoding.GetEncoding(936).GetBytes(strContent));   //x41 x42 x43 x61 x62 x63 x30 x31 x32 xC4 xE3 xCE xD2 xCB xFB   '簡體中文 (GB2312)

    //28591-ISO
    ShowCode(Encoding.GetEncoding(28591).GetBytes(strContent)); //x41 x42 x43 x61 x62 x63 x30 x31 x32 x3F x3F x3F               '西歐語系 (ISO)

    //Unicode = 1200
    ShowCode(Encoding.Unicode.GetBytes(strContent));            //x41 x00 x42 x00 x43 x00 x61 x00 x62 x00 x63 x00 x30 x00 x31 x00 x32 x00 x60 x4F x11 x62 xD6 x4E
    ShowCode(Encoding.GetEncoding(1200).GetBytes(strContent));  //x41 x00 x42 x00 x43 x00 x61 x00 x62 x00 x63 x00 x30 x00 x31 x00 x32 x00 x60 x4F x11 x62 xD6 x4E 

    //UTF8 = 65001
    ShowCode(Encoding.UTF8.GetBytes(strContent));               //x41 x42 x43 x61 x62 x63 x30 x31 x32 xE4 xBD xA0 xE6 x88 x91 xE4 xBB x96 
    ShowCode(Encoding.GetEncoding(65001).GetBytes(strContent)); //x41 x42 x43 x61 x62 x63 x30 x31 x32 xE4 xBD xA0 xE6 x88 x91 xE4 xBB x96 

    //UTF32
    ShowCode(Encoding.UTF32.GetBytes(strContent));              //x41 x00 x00 x00 x42 x00 x00 x00 x43 x00 x00 x00 x61 x00 x00 x00 x62 x00 x00 x00 x63 x00 x00 x00 x30 x00 x00 x00 x31 x00 x00 x00 x32 x00 x00 x00 x60 x4F x00 x00 x11 x62 x00 x00 xD6 x4E x00 x00 
}
private void ShowCode(byte[] Content)
{
    for (int i = 0; i < Content.Length; i++)
        Console.Write("x" + Content[i].ToString("X2") + " ");
    Console.Write("\n\r");
}

使用 Encoding.Convert 方法,可以將整個位元組陣列從一種編碼方式轉換成另一種編碼方式。

byte[] byteDefault = Encoding.Default.GetBytes(strContent);                             // 使用 Default 的編碼方式, 將 Unicode 文字內容轉 byte[] 

byte[] tmpUTF8 = Encoding.Convert(Encoding.Default, Encoding.UTF8, byteDefault);        // 將 byte[] 中的資料, 轉成 UTF8 編碼格式的 byte[]

byte[] tmpUTF32 = Encoding.Convert(Encoding.UTF8, Encoding.UTF32, tmpUTF8);             // 再轉成 UTF32 編碼格式的 byte[]
            
byte[] tmpBig5 = Encoding.Convert(Encoding.UTF32, Encoding.GetEncoding(950), tmpUTF32); // 再轉成 950 編碼格式的 byte[]

Console.WriteLine(Encoding.GetEncoding(950).GetString(tmpBig5));                        // ABCabc012你我他

底下這個範例中的文字,原本是使用 950 編碼的格式,卻使用 28591 編碼格式輸出,所以變成亂碼。用下面方法可以轉回正確的文字

string sSource = "ABCabc012§A§Ú¥L";                              //這原本是使用 950 編碼的文字,卻使用 28591 編碼輸出
byte[] byteLatin1 = Encoding.GetEncoding(28591).GetBytes(sSource);  //先用 28591 取回 byte[]
string sBig5 = Encoding.GetEncoding(950).GetString(byteLatin1);     //再用 950 解碼成字串
Console.Write(sBig5);                                               // ABCabc012你我他
}

底下這個範例示範不同編碼規則轉換後的情況:

string sDecoded;
byte[] bSource;

strContent = "ABCabc012你我他";

//下面例子:因為韓文字集與中文字集無法相對應,轉換過程資料丟失
bSource = Encoding.GetEncoding(950).GetBytes(strContent);
bSource = Encoding.Convert(Encoding.GetEncoding(950), Encoding.GetEncoding(50225), bSource);   // 將中文編碼的 byte[], 轉成韓文編碼的 byte[]
bSource = Encoding.Convert(Encoding.GetEncoding(50225), Encoding.GetEncoding(950), bSource);   // 再轉回中文編碼的 byte[]
sDecoded = Encoding.GetEncoding(950).GetString(bSource);        //ABCabc012?我他

strContent = "ABCabc012你我他堃鴴";

//下面例子:將 Unicode 文字轉換成 BIG5 編碼方式的字元陣列
//因為 BIG5 字集比 Unicode 字集少,轉換過程資料丟失
bSource = Encoding.GetEncoding(950).GetBytes(strContent);
sDecoded = Encoding.GetEncoding(950).GetString(bSource);        //ABCabc012你我他??

//下面例子:將 Unicode 文字轉換成 UTF8 編碼方式的字元陣列
//可正常轉換
bSource = Encoding.UTF8.GetBytes(strContent);
sDecoded = Encoding.UTF8.GetString(bSource);                    //ABCabc012你我他堃鴴

//下面例子:將 Unicode 文字轉換成 Unicode 編碼方式的字元陣列
//可正常轉換
bSource = Encoding.Unicode.GetBytes(strContent);
sDecoded = Encoding.Unicode.GetString(bSource);                 //ABCabc012你我他堃鴴

//下面例子:將 UTF8 -> BIG5 -> UTF8
//轉換過程會造成資料丟失,即使再轉回原來的編碼方式也無法完全。
bSource = Encoding.UTF8.GetBytes(strContent);
bSource = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(950), bSource); 
bSource = Encoding.Convert(Encoding.GetEncoding(950), Encoding.UTF8, bSource);   
sDecoded = Encoding.UTF8.GetString(bSource);                    //ABCabc012你我他??

//下面例子:先將 UTF8 -> UTF32 -> UTF8
//資料不丟失
bSource = Encoding.UTF8.GetBytes(strContent);
bSource = Encoding.Convert(Encoding.UTF8, Encoding.UTF32, bSource);   
bSource = Encoding.Convert(Encoding.UTF32, Encoding.UTF8, bSource);  
sDecoded = Encoding.UTF8.GetString(bSource);                    //ABCabc012你我他堃鴴

底下這個範例可取得系統所有可支援的 code page ,結果列於附註

foreach (EncodingInfo ei in Encoding.GetEncodings())    // 取得所有可支援的 code page
{
    Encoding code = ei.GetEncoding();

    Console.Write("{0,-6} {1,-50} ", ei.CodePage, ei.Name);
    Console.Write("{0,-8} {1,-8} ", code.IsBrowserDisplay, code.IsBrowserSave);
    Console.Write("{0,-8} {1,-8} ", code.IsMailNewsDisplay, code.IsMailNewsSave);
    Console.Write("{0,-8} {1,-8} ", code.IsSingleByte, code.IsReadOnly);
    Console.WriteLine("{0}", ei.DisplayName);
}

指定檔案的編碼格式

如何在寫入檔案時指定編碼類型

透過指定 StreamWriter 的編碼類型,可以在寫入檔案時指定檔案的編碼方式。 若沒有指明編碼方式,.Net Framework 會使用 UTF-8 編碼方式建立 StreamWriter

StreamWriter swUtf7 = new StreamWriter("utf7.txt", false, Encoding.UTF7);
swUtf7.WriteLine("Hello, World!");
swUtf7.Close();

StreamWriter swUtf8 = new StreamWriter("utf8.txt", false, Encoding.UTF8);
StreamWriter swUtf8 = new StreamWriter("utf8.txt", false); //與上一行同意
swUtf8.WriteLine("Hello, World!");
swUtf8.Close();

StreamWriter swUtf16 = new StreamWriter("utf16.txt", false, Encoding.Unicode);
swUtf16.WriteLine("Hello, World!");
swUtf16.Close();

StreamWriter swUtf32 = new StreamWriter("utf32.txt", false, Encoding.UTF32);
swUtf32.WriteLine("Hello, World!");
swUtf32.Close();

如何在讀取檔案時指定編碼類型

一般讀取檔案也是不用指定編碼類型的,.Net Framework會自動對常用的編碼方式進行解碼。 不過,你也可以在建立 Stream 建構子時,直接指明編碼的類型。

string fn;
StreamReader sr;

//不指定編碼方式,.Net自動對常用編碼方式進行解碼,所以程式不會出錯
fn = "utf8.txt";
sr = new StreamReader(fn);
Console.WriteLine(sr.ReadToEnd());
sr.Close();

//指定編碼方式UTF7進行解碼
fn = "utf7.txt";
sr = new StreamReader(fn, Encoding.UTF7);
Console.WriteLine(sr.ReadToEnd());
sr.Close();

//不指定編碼方式,因為UTF7不是常用編碼,.Net無法自動進行解碼,所以輸出會有亂碼
fn = "utf7.txt";
sr = new StreamReader(fn);
Console.WriteLine(sr.ReadToEnd());
sr.Close();

請注意, Encoding 主要是處理 Unicode 字元,而不是任意的二進位資料,例如位元組陣列。 如果應用程式必須將任意二進位資料編碼成文字,應該使用諸如 uuencode 的通訊協定;該通訊協定是由 Convert.ToBase64CharArray 之類的方法所實作。

附註:使用 GetEncodings 取得的系統編碼類型
CodePageNameBrDispBrSaveMNDispMNSave1-ByteReadOnlyDisplay
37IBM037FalseFalseFalseFalseTrueTrueIBM EBCDIC (美國-加拿大)
437IBM437FalseFalseFalseFalseTrueTrueOEM 美國
500IBM500FalseFalseFalseFalseTrueTrueIBM EBCDIC (國際)
708ASMO-708TrueTrueFalseFalseTrueTrue阿拉伯文 (ASMO 708)
720DOS-720TrueTrueFalseFalseTrueTrue阿拉伯文 (DOS)
737ibm737FalseFalseFalseFalseTrueTrue希臘文 (DOS)
775ibm775FalseFalseFalseFalseTrueTrue波羅的海文 (DOS)
850ibm850FalseFalseFalseFalseTrueTrue西歐語系 (DOS)
852ibm852TrueTrueFalseFalseTrueTrue中歐語系 (DOS)
855IBM855FalseFalseFalseFalseTrueTrueOEM 斯拉夫文
857ibm857FalseFalseFalseFalseTrueTrue土耳其文 (DOS)
858IBM00858FalseFalseFalseFalseTrueTrueOEM 多語系拉丁文 I
860IBM860FalseFalseFalseFalseTrueTrue葡萄牙文 (DOS)
861ibm861FalseFalseFalseFalseTrueTrue冰島文 (DOS)
862DOS-862TrueTrueFalseFalseTrueTrue希伯來文 (DOS)
863IBM863FalseFalseFalseFalseTrueTrue加拿大法文 (DOS)
864IBM864FalseFalseFalseFalseTrueTrue阿拉伯文 (864)
865IBM865FalseFalseFalseFalseTrueTrue北歐字母 (DOS)
866cp866TrueTrueFalseFalseTrueTrue斯拉夫文 (DOS)
869ibm869FalseFalseFalseFalseTrueTrue希臘文,現代 (DOS)
870IBM870FalseFalseFalseFalseTrueTrueIBM EBCDIC (多語系拉丁文 2)
874windows-874TrueTrueTrueTrueTrueTrue泰文 (Windows)
875cp875FalseFalseFalseFalseTrueTrueIBM EBCDIC (希臘現代)
932shift_jisTrueTrueTrueTrueFalseTrue日文 (Shift-JIS)
936gb2312TrueTrueTrueTrueFalseTrue簡體中文 (GB2312)
949ks_c_5601-1987TrueTrueTrueTrueFalseTrue韓文
950big5TrueTrueTrueTrueFalseTrue繁體中文 (Big5)
1026IBM1026FalseFalseFalseFalseTrueTrueIBM EBCDIC (土耳其拉丁文 5)
1047IBM01047FalseFalseFalseFalseTrueTrueIBM 拉丁文 1
1140IBM01140FalseFalseFalseFalseTrueTrueIBM EBCDIC (美國-加拿大-歐洲)
1141IBM01141FalseFalseFalseFalseTrueTrueIBM EBCDIC (德國-歐洲)
1142IBM01142FalseFalseFalseFalseTrueTrueIBM EBCDIC (丹麥-挪威-歐洲)
1143IBM01143FalseFalseFalseFalseTrueTrueIBM EBCDIC (芬蘭-瑞典-歐洲)
1144IBM01144FalseFalseFalseFalseTrueTrueIBM EBCDIC (義大利-歐洲)
1145IBM01145FalseFalseFalseFalseTrueTrueIBM EBCDIC (?霂Z牙-歐洲)
1146IBM01146FalseFalseFalseFalseTrueTrueIBM EBCDIC (英國-歐洲)
1147IBM01147FalseFalseFalseFalseTrueTrueIBM EBCDIC (法國-歐洲)
1148IBM01148FalseFalseFalseFalseTrueTrueIBM EBCDIC (國際-歐洲)
1149IBM01149FalseFalseFalseFalseTrueTrueIBM EBCDIC (冰島-歐洲)
1200utf-16FalseTrueFalseFalseFalseTrueUnicode
1201utf-16BEFalseFalseFalseFalseFalseTrueUnicode (位元組由大到小)
1250windows-1250TrueTrueTrueTrueTrueTrue中歐語系 (Windows)
1251windows-1251TrueTrueTrueTrueTrueTrue斯拉夫文 (Windows)
1252Windows-1252TrueTrueTrueTrueTrueTrue西歐語系 (Windows)
1253windows-1253TrueTrueTrueTrueTrueTrue希臘文 (Windows)
1254windows-1254TrueTrueTrueTrueTrueTrue土耳其文 (Windows)
1255windows-1255TrueTrueTrueTrueTrueTrue希伯來文 (Windows)
1256windows-1256TrueTrueTrueTrueTrueTrue阿拉伯文 (Windows)
1257windows-1257TrueTrueTrueTrueTrueTrue波羅的海文 (Windows)
1258windows-1258TrueTrueTrueTrueTrueTrue越南文 (Windows)
1361JohabFalseFalseFalseFalseFalseTrue韓文 (Johab)
10000macintoshFalseFalseFalseFalseTrueTrue西歐語系 (Mac)
10001x-mac-japaneseFalseFalseFalseFalseFalseTrue日文 (Mac)
10002x-mac-chinesetradFalseFalseFalseFalseFalseTrue繁體中文 (Mac)
10003x-mac-koreanFalseFalseFalseFalseFalseTrue韓文 (Mac)
10004x-mac-arabicFalseFalseFalseFalseTrueTrue阿拉伯文 (Mac)
10005x-mac-hebrewFalseFalseFalseFalseTrueTrue希伯來文 (Mac)
10006x-mac-greekFalseFalseFalseFalseTrueTrue希臘文 (Mac)
10007x-mac-cyrillicFalseFalseFalseFalseTrueTrue斯拉夫文 (Mac)
10008x-mac-chinesesimpFalseFalseFalseFalseFalseTrue簡體中文 (Mac)
10010x-mac-romanianFalseFalseFalseFalseTrueTrue羅馬尼亞文 (Mac)
10017x-mac-ukrainianFalseFalseFalseFalseTrueTrue烏克蘭文 (Mac)
10021x-mac-thaiFalseFalseFalseFalseTrueTrue泰文 (Mac)
10029x-mac-ceFalseFalseFalseFalseTrueTrue中歐語系 (Mac)
10079x-mac-icelandicFalseFalseFalseFalseTrueTrue冰島文 (Mac)
10081x-mac-turkishFalseFalseFalseFalseTrueTrue土耳其文 (Mac)
10082x-mac-croatianFalseFalseFalseFalseTrueTrue克羅埃西亞文 (Mac)
12000utf-32FalseFalseFalseFalseFalseTrueUnicode (UTF-32)
12001utf-32BEFalseFalseFalseFalseFalseTrueUnicode (UTF-32 位元組由大到小)
20000x-Chinese-CNSFalseFalseFalseFalseFalseTrue繁體中文 (CNS)
20001x-cp20001FalseFalseFalseFalseFalseTrueTCA 台灣
20002x-Chinese-EtenFalseFalseFalseFalseFalseTrue繁體中文 (Eten)
20003x-cp20003FalseFalseFalseFalseFalseTrueIBM5550 台灣
20004x-cp20004FalseFalseFalseFalseFalseTrueTeleText 台灣
20005x-cp20005FalseFalseFalseFalseFalseTrueWang 台灣
20105x-IA5FalseFalseFalseFalseTrueTrue西歐語系 (IA5)
20106x-IA5-GermanFalseFalseFalseFalseTrueTrue德文 (IA5)
20107x-IA5-SwedishFalseFalseFalseFalseTrueTrue瑞典文 (IA5)
20108x-IA5-NorwegianFalseFalseFalseFalseTrueTrue挪威文 (IA5)
20127us-asciiFalseFalseTrueTrueTrueTrueUS-ASCII
20261x-cp20261FalseFalseFalseFalseFalseTrueT.61
20269x-cp20269FalseFalseFalseFalseTrueTrueISO-6937
20273IBM273FalseFalseFalseFalseTrueTrueIBM EBCDIC (德國)
20277IBM277FalseFalseFalseFalseTrueTrueIBM EBCDIC (丹麥-挪威)
20278IBM278FalseFalseFalseFalseTrueTrueIBM EBCDIC (芬蘭-瑞典)
20280IBM280FalseFalseFalseFalseTrueTrueIBM EBCDIC (義大利)
20284IBM284FalseFalseFalseFalseTrueTrueIBM EBCDIC (西班牙)
20285IBM285FalseFalseFalseFalseTrueTrueIBM EBCDIC (UK)
20290IBM290FalseFalseFalseFalseTrueTrueIBM EBCDIC (日文片假名)
20297IBM297FalseFalseFalseFalseTrueTrueIBM EBCDIC (法國)
20420IBM420FalseFalseFalseFalseTrueTrueIBM EBCDIC (阿拉伯文)
20423IBM423FalseFalseFalseFalseTrueTrueIBM EBCDIC (希臘文)
20424IBM424FalseFalseFalseFalseTrueTrueIBM EBCDIC (希伯來文)
20833x-EBCDIC-KoreanExtendedFalseFalseFalseFalseTrueTrueIBM EBCDIC (韓文擴充)
20838IBM-ThaiFalseFalseFalseFalseTrueTrueIBM EBCDIC (泰國)
20866koi8-rTrueTrueTrueTrueTrueTrue斯拉夫文 (KOI8-R)
20871IBM871FalseFalseFalseFalseTrueTrueIBM EBCDIC (冰島)
20880IBM880FalseFalseFalseFalseTrueTrueIBM EBCDIC (斯拉夫俄文)
20905IBM905FalseFalseFalseFalseTrueTrueIBM EBCDIC (土耳其)
20924IBM00924FalseFalseFalseFalseTrueTrueIBM 拉丁文 1
20932EUC-JPFalseFalseFalseFalseFalseTrue日文 (JIS 0208-1990 和 0212-1990)
20936x-cp20936FalseFalseFalseFalseFalseTrue簡體中文 (GB2312-80)
20949x-cp20949FalseFalseFalseFalseFalseTrue韓文 Wansung
21025cp1025FalseFalseFalseFalseTrueTrueIBM EBCDIC (斯拉夫塞爾維亞文-保加利亞文)
21866koi8-uTrueTrueTrueTrueTrueTrue斯拉夫文 (KOI8-U)
28591iso-8859-1TrueTrueTrueTrueTrueTrue西歐語系 (ISO)
28592iso-8859-2TrueTrueTrueTrueTrueTrue中歐語系 (ISO)
28593iso-8859-3FalseFalseTrueTrueTrueTrue拉丁文 3 (ISO)
28594iso-8859-4TrueTrueTrueTrueTrueTrue波羅的海文 (ISO)
28595iso-8859-5TrueTrueTrueTrueTrueTrue斯拉夫文 (ISO)
28596iso-8859-6TrueTrueTrueTrueTrueTrue阿拉伯文 (ISO)
28597iso-8859-7TrueTrueTrueTrueTrueTrue希臘文 (ISO)
28598iso-8859-8TrueTrueFalseFalseTrueTrue希伯來文 (ISO-Visual)
28599iso-8859-9TrueTrueTrueTrueTrueTrue土耳其文 (ISO)
28603iso-8859-13FalseFalseTrueTrueTrueTrue愛沙尼亞文 (ISO)
28605iso-8859-15FalseTrueTrueTrueTrueTrue拉丁文 9 (ISO)
29001x-EuropaFalseFalseFalseFalseTrueTrue歐洲
38598iso-8859-8-iTrueTrueTrueTrueTrueTrue希伯來文 (ISO-Logical)
50220iso-2022-jpFalseFalseTrueTrueFalseTrue日文 (JIS)
50221csISO2022JPFalseTrueTrueTrueFalseTrue日文 (JIS-Allow 1 byte Kana)
50222iso-2022-jpFalseFalseFalseFalseFalseTrue日文 (JIS-Allow 1 byte Kana - SO/SI)
50225iso-2022-krFalseFalseTrueFalseFalseTrue韓文 (ISO)
50227x-cp50227FalseFalseFalseFalseFalseTrue簡體中文 (ISO-2022)
51932euc-jpTrueTrueTrueTrueFalseTrue日文 (EUC)
51936EUC-CNFalseFalseFalseFalseFalseTrue簡體中文 (EUC)
51949euc-krFalseFalseTrueTrueFalseTrue韓文 (EUC)
52936hz-gb-2312TrueTrueTrueTrueFalseTrue簡體中文 (HZ)
54936GB18030TrueTrueTrueTrueFalseTrue簡體中文 (GB18030)
57002x-iscii-deFalseFalseFalseFalseFalseTrueISCII 梵文語系
57003x-iscii-beFalseFalseFalseFalseFalseTrueISCII 孟加拉文
57004x-iscii-taFalseFalseFalseFalseFalseTrueISCII 坦米爾文
57005x-iscii-teFalseFalseFalseFalseFalseTrueISCII 特拉古文
57006x-iscii-asFalseFalseFalseFalseFalseTrueISCII 阿薩姆文
57007x-iscii-orFalseFalseFalseFalseFalseTrueISCII 歐利亞文
57008x-iscii-kaFalseFalseFalseFalseFalseTrueISCII 坎那達文
57009x-iscii-maFalseFalseFalseFalseFalseTrueISCII 馬來亞拉姆文
57010x-iscii-guFalseFalseFalseFalseFalseTrueISCII 古吉拉特文
57011x-iscii-paFalseFalseFalseFalseFalseTrueISCII 旁遮普語
65000utf-7FalseFalseTrueTrueFalseTrueUnicode (UTF-7)
65001utf-8TrueTrueTrueTrueFalseTrueUnicode (UTF-8)

1 則留言:

  1. 謝謝你的文章 , 困擾我二年多的問題 , 網路上問了一堆人無法解決 , 居然在這裡找到答案 , 太感謝了 !!

    回覆刪除