UTF-8與其他編碼比較,它劣勢在哪?

如題。從兩年前開始做軟體項目,不管前台,後台,還是資料庫,都統一使用 Unicode 中的 UTF-8。發現真的不用擔心數據傳輸時轉碼的問題。 暫且不管 UTF-32,UTF-16 與之相比如何如何。 在創建資料庫時,我發現還有其他很多的編碼,比如 armscii8,sjis,swe7 等等很多很多我都沒有見過的,估計是我目前的層次還接觸不到。與它們相比,UTF-8 有沒有什麼短板?


可以看看這個: Unicode Basics: What"s Character Set, Character Encoding, UTF-8?

自己總結了一下: 字元編碼是什麼鬼


歡迎參考本人最近寫得計算機字元編碼介紹:計算機字元編碼原理介紹

很多人基本概念都弄錯了,字符集和編碼是兩回事,Unicode只是個字符集而已,具體怎麼編碼有很多方案,包括UTF-32, UTF-16, UTF-8, UCS-2, UCS-4等等。


Unicode 是一整套龐大的標準,包含字符集定義以及編碼方案等等層面。

題主和好幾個答題者(比如 Zyzsdy Ted)的措詞體現出根本沒理解 Unicode 這個體系的邏輯。導致連在這個問答里到底該討論字符集的問題還是編碼的問題都沒有共識。先讀點書再思考這些事情吧。


Unicode的各種形式都是變長編碼,C語言要處理起來非常複雜

Unicode有很多同字異體是同位的,中國的簡體字門和日本俗字 同字頭中間插一點 就同位 導致在部分環境中不倫不類


UTF-8的短板在於做string manipulation特別苦逼。完美解決這個問題的是UTF-32,然而這會讓你的存儲空間加大。次一點的是UTF-16,你只需要管surrogate的問題就好了(比UTF-8容易操作多了),而且保存中文比UTF-8減少了1/3的空間。


Unicode作為一種編碼最大的缺點是它僅僅是一種編碼。

我們說的其他的編碼,一般包括兩個主要的部分,即編碼(內碼)和存儲格式(外碼)。前者負責進行字元和數據的映射,後者負責如何存儲這些數據。

然而Unicode只規定了前者。它把所有的字元都用一個整數來編碼。但是並沒有規定如何存儲這個整數。

於是我們有了UTF-8,UTF-16LE和UTF-16BE以及UTF-32這樣東西。

然而Unicode這樣做也是有好處的,比如發現或者創造一個新字元,我們就可以無視存儲格式直接賦予它新的編碼。這保證了Unicode作為「字元統一編碼」的優點。

剩下的問題就是比較占空間了。但是編碼統一帶來的好處遠遠超過了占這些空間的付出。


總結一下上面的陳述

unicode只是一個interface

UTF-XX 是這個介面的實現


劣勢僅僅在於表示中文字元需要3位元組而不是2位元組;除此之外,全是優勢!


utf-8表示中文平均是3位元組,大字符集是4位元組。GB18030隻佔兩個位元組


那些奇奇怪怪的編碼你最好永遠都接觸不到,它們都是歷史了,除非你有遠古時期的數據或者遠古時期的程序需要交互,否則就別管它們了。

UTF-8唯一的競爭對手就是UTF-16和UTF-32。

此外GB-18030等編碼也是支持unicode的,不過理解為一種從GB-2312編碼過渡到到unicode時代的過渡編碼方案比較好。


UTF-8同時具備以下三個重要優點,而別的編碼方式很難同時具備這三點。

  1. 字符集巨大
  2. 空間代價低

  3. ASCII(0-127)兼容


補充 @梁海的說明,我以前也分不清Unicode、UCS-2、UCS-4,UTF-8、UTF-16之間的區別,剛剛查閱了一下官方文檔,分享一下:

Unicode Wiki:http://zh.wikipedia.org/zh-cn/Unicode

官方文檔:http://www.unicode.org/versions/Unicode7.0.0/#Database_Changes

術語定義:http://www.unicode.org/glossary/#core_specification

Unicode標準:

Version 7.0 of the Unicode Standard consists of the core specification (download), the delta and archival code charts for this version, the Unicode Standard Annexes, and the Unicode Character Database (UCD).

The core specification gives the general principles, requirements for conformance, and guidelines for implementers. The code charts show representative glyphs for all the Unicode characters. The Unicode Standard Annexes supply detailed normative information about particular aspects of the standard. The Unicode Character Database supplies normative and informative data for implementers to allow them to implement the Unicode Standard.

UCS-2 和UCS-4

UCS-2. ISO/IEC 10646 encoding form: Universal Character Set coded in 2 octets, limited to the Basic Multilingual Plane. (See Appendix C, Relationship to ISO/IEC 10646.)

UCS-4. ISO/IEC 10646 encoding form: Universal Character Set coded in 4 octets. (See Appendix C, Relationship to ISO/IEC 10646.)

UTF-8、UTF-16和UTF-32

Unicode Encoding Form. A character encoding form that assigns each Unicode scalar value to a unique code unit sequence. The Unicode Standard defines three Unicode encoding forms: UTF-8, UTF-16, and UTF-32. (See definition D79 in Section 3.9, Unicode Encoding Forms.)

所以,Unicode標準是包含字符集定義和編碼實現方式(如何存儲)的,UCS-2和UCS-4是字符集,UTF-8、UTF-16和UTF-32是編碼實現方式。

所以題主把題目改成UTF-8比較好。


我覺得這個問題是不是可以這麼理解,題主說的那些編碼,形形色色,但是不統一,所以出現了Unicode 統一編碼。 所以其他編碼能表示的都是unicode的子集。從這點講,為了表示更多的字元,一定會有多餘的開銷。


推薦閱讀:

熔絲和空開對比,各有什麼優缺點?通信機房的綜合櫃從開關電源引電怎麼選擇空開和熔絲?
大學想學物聯網工程和通信工程哪個好?
technical writer 、文檔開發工程師的前景及工作的一些具體細節問題?
TD-SCDMA到底不好在哪兒?
單從性能上講,金屬手機殼和塑料手機殼哪個好?

TAG:資料庫 | 編程 | Unicode統一碼 | 字元編碼 | 通信工程 |