什麼是Unicode?歷史上,有兩個獨立的,創立單一字符集的嘗試.一個是國際標準化組織(ISO)的ISO10646專案,另一個是由(一開始大多是美國的)多語言軟體製造商組成的協會組織的Unicode專案.幸運的是,1991年前後,兩個專案的參與者都認識到,世界不需要兩個不同的單一字符集.它們合併雙方的工作成果,併為創立一個單一編碼表而協同工作.兩個專案仍都存在並獨立地公佈各自的標準,但Unicode協會和ISO/IECJTC1/SC2都同意保持Unicode和ISO10646標準的碼錶相容,並緊密地共同調整任何未來的擴充套件.UnicodevsISO10646Unicode協會公佈的Unicode標準嚴密地包含了ISO10646-1實現級別3的基本多語言面.在兩個標準裡所有的字元都在相同的位置並且有相同的名字.Unicode標準額外定義了許多與字元有關的語義符號學,一般而言是對於實現高質量的印刷出版系統的更好的參考.Unicode詳細說明了繪製某些語言(比如阿拉伯語)表達形式的演算法,處理雙向文字(比如拉丁與希伯來文混合文字)的演算法和排序與字串比較所需的演算法,以及其他許多東西.另一方面,ISO10646標準,就象廣為人知的ISO8859標準一樣,只不過是一個簡單的字符集表.它指定了一些與標準有關的術語,定義了一些編碼的別名,幷包括了規範說明,指定了怎樣使用UCS連線其他ISO標準的實現,比如ISO6429和ISO2022.還有一些與ISO緊密相關的,比如ISO14651是關於UCS字串排序的.考慮到Unicode標準有一個易記的名字,且在任何好的書店裡的Addison-Wesley裡有,只花費ISO版本的一小部分,且包括的輔助資訊,因而它成為使用廣泛得多的參考也就不足為奇了.然而,一般認為,用於列印ISO10646-1標準的字型在某些方面的質量要高於用於列印Unicode2.0的.專業字型設計者總是被建議說要兩個標準都實現,但一些提供的樣例字形有顯著的區別.ISO10646-1標準同樣使用四種不同的風格變體來顯示錶意文字如中文,日文和韓文(CJK),而Unicode2.0的表裡只有中文的變體.這導致了普遍的認為Unicode對日本使用者來說是不可接收的傳說,儘管是錯誤的.UTF-8首先UCS和Unicode只是分配整數給字元的編碼表.現在存在好幾種將一串字元表示為一串位元組的方法.最顯而易見的兩種方法是將Unicode文字儲存為2個或4個位元組序列的串.這兩種方法的正式名稱分別為UCS-2和UCS-4.除非另外指定,否則大多數的位元組都是這樣的(Bigendianconvention).將一個ASCII或Latin-1的檔案轉換成UCS-2只需簡單地在每個ASCII位元組前插入0x00.如果要轉換成UCS-4,則必須在每個ASCII位元組前插入三個0x00.在Unix下使用UCS-2(或UCS-4)會導致非常嚴重的問題.用這些編碼的字串會包含一些特殊的字元,比如"\0"或"/",它們在檔名和其他C庫函式引數裡都有特別的含義.另外,大多數使用ASCII檔案的UNIX下的工具,如果不進行重大修改是無法讀取16位的字元的.基於這些原因,在檔名,文字檔案,環境變數等地方,UCS-2不適合作為Unicode的外部編碼.在ISO10646-1AnnexR和RFC2279裡定義的UTF-8編碼沒有這些問題.它是在Unix風格的作業系統下使用Unicode的明顯的方法.UTF-8有一下特性:UCS字元U+0000到U+007F(ASCII)被編碼為位元組0x00到0x7F(ASCII相容).這意味著只包含7位ASCII字元的檔案在ASCII和UTF-8兩種編碼方式下是一樣的.所有>U+007F的UCS字元被編碼為一個多個位元組的串,每個位元組都有標記位集.因此,ASCII位元組(0x00-0x7F)不可能作為任何其他字元的一部分.表示非ASCII字元的多位元組串的第一個位元組總是在0xC0到0xFD的範圍裡,並指出這個字元包含多少個位元組.多位元組串的其餘位元組都在0x80到0xBF範圍裡.這使得重新同步非常容易,並使編碼無國界,且很少受丟失位元組的影響.可以編入所有可能的231個UCS程式碼UTF-8編碼字元理論上可以最多到6個位元組長,然而16位BMP字元最多隻用到3位元組長.BigendianUCS-4位元組串的排列順序是預定的.位元組0xFE和0xFF在UTF-8編碼中從未用到.下列位元組串用來表示一個字元.用到哪個串取決於該字元在Unicode中的序號.U-00000000-U-0000007F:0xxxxxxxU-00000080-U-000007FF:110xxxxx10xxxxxxU-00000800-U-0000FFFF:1110xxxx10xxxxxx10xxxxxxU-00010000-U-001FFFFF:11110xxx10xxxxxx10xxxxxx10xxxxxxU-00200000-U-03FFFFFF:111110xx10xxxxxx10xxxxxx10xxxxxx10xxxxxxU-04000000-U-7FFFFFFF:1111110x10xxxxxx10xxxxxx10xxxxxx10xxxxxx10xxxxxxxxx的位置由字元編碼數的二進位制表示的位填入.越靠右的x具有越少的特殊意義.只用最短的那個足夠表達一個字元編碼數的多位元組串.注意在多位元組串中,第一個位元組的開頭"1"的數目就是整個串中位元組的數目.例如:Unicode字元U+00A9=10101001(版權符號)在UTF-8裡的編碼為:1100001010101001=0xC20xA9而字元U+2260=0010001001100000(不等於)編碼為:111000101000100110100000=0xE20x890xA0這種編碼的官方名字拼寫為UTF-8,其中UTF代表UCSTransformationFormat.請勿在任何文件中用其他名字(比如utf8或UTF_8)來表示UTF-8,當然除非你指的是一個變數名而不是這種編碼本身.
什麼是Unicode?歷史上,有兩個獨立的,創立單一字符集的嘗試.一個是國際標準化組織(ISO)的ISO10646專案,另一個是由(一開始大多是美國的)多語言軟體製造商組成的協會組織的Unicode專案.幸運的是,1991年前後,兩個專案的參與者都認識到,世界不需要兩個不同的單一字符集.它們合併雙方的工作成果,併為創立一個單一編碼表而協同工作.兩個專案仍都存在並獨立地公佈各自的標準,但Unicode協會和ISO/IECJTC1/SC2都同意保持Unicode和ISO10646標準的碼錶相容,並緊密地共同調整任何未來的擴充套件.UnicodevsISO10646Unicode協會公佈的Unicode標準嚴密地包含了ISO10646-1實現級別3的基本多語言面.在兩個標準裡所有的字元都在相同的位置並且有相同的名字.Unicode標準額外定義了許多與字元有關的語義符號學,一般而言是對於實現高質量的印刷出版系統的更好的參考.Unicode詳細說明了繪製某些語言(比如阿拉伯語)表達形式的演算法,處理雙向文字(比如拉丁與希伯來文混合文字)的演算法和排序與字串比較所需的演算法,以及其他許多東西.另一方面,ISO10646標準,就象廣為人知的ISO8859標準一樣,只不過是一個簡單的字符集表.它指定了一些與標準有關的術語,定義了一些編碼的別名,幷包括了規範說明,指定了怎樣使用UCS連線其他ISO標準的實現,比如ISO6429和ISO2022.還有一些與ISO緊密相關的,比如ISO14651是關於UCS字串排序的.考慮到Unicode標準有一個易記的名字,且在任何好的書店裡的Addison-Wesley裡有,只花費ISO版本的一小部分,且包括的輔助資訊,因而它成為使用廣泛得多的參考也就不足為奇了.然而,一般認為,用於列印ISO10646-1標準的字型在某些方面的質量要高於用於列印Unicode2.0的.專業字型設計者總是被建議說要兩個標準都實現,但一些提供的樣例字形有顯著的區別.ISO10646-1標準同樣使用四種不同的風格變體來顯示錶意文字如中文,日文和韓文(CJK),而Unicode2.0的表裡只有中文的變體.這導致了普遍的認為Unicode對日本使用者來說是不可接收的傳說,儘管是錯誤的.UTF-8首先UCS和Unicode只是分配整數給字元的編碼表.現在存在好幾種將一串字元表示為一串位元組的方法.最顯而易見的兩種方法是將Unicode文字儲存為2個或4個位元組序列的串.這兩種方法的正式名稱分別為UCS-2和UCS-4.除非另外指定,否則大多數的位元組都是這樣的(Bigendianconvention).將一個ASCII或Latin-1的檔案轉換成UCS-2只需簡單地在每個ASCII位元組前插入0x00.如果要轉換成UCS-4,則必須在每個ASCII位元組前插入三個0x00.在Unix下使用UCS-2(或UCS-4)會導致非常嚴重的問題.用這些編碼的字串會包含一些特殊的字元,比如"\0"或"/",它們在檔名和其他C庫函式引數裡都有特別的含義.另外,大多數使用ASCII檔案的UNIX下的工具,如果不進行重大修改是無法讀取16位的字元的.基於這些原因,在檔名,文字檔案,環境變數等地方,UCS-2不適合作為Unicode的外部編碼.在ISO10646-1AnnexR和RFC2279裡定義的UTF-8編碼沒有這些問題.它是在Unix風格的作業系統下使用Unicode的明顯的方法.UTF-8有一下特性:UCS字元U+0000到U+007F(ASCII)被編碼為位元組0x00到0x7F(ASCII相容).這意味著只包含7位ASCII字元的檔案在ASCII和UTF-8兩種編碼方式下是一樣的.所有>U+007F的UCS字元被編碼為一個多個位元組的串,每個位元組都有標記位集.因此,ASCII位元組(0x00-0x7F)不可能作為任何其他字元的一部分.表示非ASCII字元的多位元組串的第一個位元組總是在0xC0到0xFD的範圍裡,並指出這個字元包含多少個位元組.多位元組串的其餘位元組都在0x80到0xBF範圍裡.這使得重新同步非常容易,並使編碼無國界,且很少受丟失位元組的影響.可以編入所有可能的231個UCS程式碼UTF-8編碼字元理論上可以最多到6個位元組長,然而16位BMP字元最多隻用到3位元組長.BigendianUCS-4位元組串的排列順序是預定的.位元組0xFE和0xFF在UTF-8編碼中從未用到.下列位元組串用來表示一個字元.用到哪個串取決於該字元在Unicode中的序號.U-00000000-U-0000007F:0xxxxxxxU-00000080-U-000007FF:110xxxxx10xxxxxxU-00000800-U-0000FFFF:1110xxxx10xxxxxx10xxxxxxU-00010000-U-001FFFFF:11110xxx10xxxxxx10xxxxxx10xxxxxxU-00200000-U-03FFFFFF:111110xx10xxxxxx10xxxxxx10xxxxxx10xxxxxxU-04000000-U-7FFFFFFF:1111110x10xxxxxx10xxxxxx10xxxxxx10xxxxxx10xxxxxxxxx的位置由字元編碼數的二進位制表示的位填入.越靠右的x具有越少的特殊意義.只用最短的那個足夠表達一個字元編碼數的多位元組串.注意在多位元組串中,第一個位元組的開頭"1"的數目就是整個串中位元組的數目.例如:Unicode字元U+00A9=10101001(版權符號)在UTF-8裡的編碼為:1100001010101001=0xC20xA9而字元U+2260=0010001001100000(不等於)編碼為:111000101000100110100000=0xE20x890xA0這種編碼的官方名字拼寫為UTF-8,其中UTF代表UCSTransformationFormat.請勿在任何文件中用其他名字(比如utf8或UTF_8)來表示UTF-8,當然除非你指的是一個變數名而不是這種編碼本身.