除了emoji,有沒有用utf16兩個位元組表示不了而且現代文章/姓名中會使用的cjkv字元么?

如果有utf16兩個位元組表示不了而且現代文章/姓名會使用的cjkv字元,請舉例。在寫string類,不確定存儲用utf16還是utf32。


如果要跨平台,老老實實用utf8,如果只兼容windows,並且涉及到界面,最方便的還是unicode(utf16)


目前的總結

作為string類:

UTF-8:做持久存儲用途沒有BOM問題,與ascii兼容。隨機定位不方便,直接隨機定位性能很差,目前想到的解決辦法是維護一張惰性更新的字對位元組的表來隨機定位。

UTF-16:與windows api兼容,兩個位元組能應付大部分日常用字。做持久存儲用途有BOM問題,發現了有些港台用字不在兩位元組支持範圍(如「 仔」的「 」字、「 魚」的「 」字)

知乎吞了utf16兩位元組表示不了的字元,被吞的字元如下:

- 維基百科,自由嘅百科全書

https://zh-yue.wikipedia.org/wiki/%F0%A9%B6%98%E9%AD%9A

UTF-32:四位元組可容納所有平面中任意字元,一般通途(不用拼字等unicode高級功能)不會有字與位元組不對應情況。做持久存儲用途有BOM問題,佔用空間大。


utf8,utf16,utf32從定義上講都是變長編碼。對於16bit表示不了的字,utf16會用連續兩個16bit字元表示。

所以理論上沒有utf編碼表示不了的unicode。因為utf編碼族都是變長的。

ucs2才是定長編碼。它對應utf16在bmp之內的字元,它是utf16的子集。而目前一些emoji在bmp之外。這意味著ucs2無法表示這些新出的emoji。

換句話說,用utf16依然是變長的,用ucs2則會影響兼容性。

字元串內部存儲用utf32或者utf8都可以,不建議用utf16。


年輕人,utf8才是正途。

還有utf16不一定是兩個位元組哦,她也能表示emoji的喲,剩下的所有unicode字元也都可以的喲


額,開始看錯了題。

如果是寫 String 類的話,推薦用 UTF-16。UTF-32佔用空間太大了,UTF-16 一般情況下都能適用,不行的話像 Java 再提供遍歷碼點的方法就行了。


utf16需要代理對的情況比較常出現

之前封裝freetype給opencv用的時候就發現有很多字都會遇到代理對


在擴展區,有中文生僻字的。使用utf16吧,32太浪費


CJK擴展區ABCDEF任選,GB18030任選,HKSCS任選。

只支持雙位元組,不支持可變長編碼的應當稱作UCS-2。


utf-16也不一定是兩個位元組,ucs2才是兩個位元組。可以看C++11與Unicode及使用標準庫進行UTF-8、UTF-16、UCS2、UCS4/UTF-32編碼轉換 我覺得這篇文章整理的比較好了。


UTF-8以位元組為單位存儲字元,一個字元最短1位元組(ASCII非擴展字符集),最長4位元組(可以表示任意Unicode代碼點)。理論上UTF-8最長可以是6位元組,但實際上Unicode沒有那麼多的字元需要表示。

UTF-16以雙位元組(在x86平台上又叫「字」,word;在C語言里與短整型長度一樣,可以用unsigned short來表示)來存儲字元。一個雙位元組叫「碼元」(code unit)。一個字元最短2位元組,最長4位元組。2位元組可以表示BMP(基本多語言平面,Basic Multilingual Plane)中的所有字元。而0xD800--0xDFFF範圍是保留的,保留的目的就是用於叫「代理對」(surrogate pair)的東西。一個代理對就是4位元組的表示方式。它是兩個UTF-16碼元,第一個位於0xD800--0xDBFF範圍,第二個位於0xDC00--0xDFFF範圍。可以用來表示BMP之外的所有其他Unicode字元,包括emoji。

UTF-16有大小數端的考慮,也就是它的unsigned short碼元的位元組序。在Windows平台上通常使用UTF-16LE(Windows NT 4只支持BMP字元,所以不支持UTF-16,只支持UCS-2;Windows 2000開始在API層面支持UTF-16,Windows 7(也許還有Windows Vista?)開始在UI控制項上支持所有UTF-16字元的顯示,前提是系統已經安裝了相應字體),也就是little endian(小數端)表示。比如ASCII 0D 0A用UTF-16LE表示出來就是0D 00 0A 00。


推薦閱讀:

c++如何做設計?或者推薦一些比較簡單的開源項目,適合新手練手的。
單精度浮點數中的「單」和「浮點」是什麼意思?
你為什麼喜歡編程?
Concept 對 C++ 有什麼影響,它和 Rust 的泛型 Bound 和 Trait 有點類似?

TAG:Unicode統一碼 | 字元編碼 | C |