小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

【好】簡(jiǎn)單幾句話總結(jié)Unicode,UTF

 cjavahtml 2018-02-16

概念

先說(shuō)一說(shuō)基本的概念,這包括什么是Unicode,什么是UTF-8,什么是UTF-16。

Unicode,UTF-8,UTF-16完整的說(shuō)明請(qǐng)參考Wiki(Unicode,UTF-8UTF-16)。用比較簡(jiǎn)單的話來(lái)說(shuō)就是,Unicode定義了所有可以用來(lái)表示字符的數(shù)值集合(稱之為Code Point)。UTF-8和UTF-16等UTF標(biāo)準(zhǔn)定義了這些數(shù)值和字符的映射關(guān)系。

UTF-8

優(yōu)勢(shì)

UTF-8最大的優(yōu)勢(shì)是,沒(méi)有字節(jié)序的概念。所以特別適合用于字符串的網(wǎng)絡(luò)數(shù)據(jù)傳輸,不用考慮大小端問(wèn)題。對(duì)于非英文網(wǎng)頁(yè)(對(duì)于我們而言,簡(jiǎn)單說(shuō)東亞文字網(wǎng)頁(yè)),能夠避免各種亂碼問(wèn)題。

劣勢(shì)

本地字符串處理過(guò)程中,如果使用UTF-8,對(duì)于英文字符的處理沒(méi)有太大的問(wèn)題。一個(gè)char變量表示一個(gè)英文字符。但是對(duì)于中文等遠(yuǎn)東字符集來(lái)說(shuō),就比較坑爹了。char str[]; str[0]并不能完整表示一個(gè)漢字。UTF-8編碼格式下,一個(gè)漢字需要至少3個(gè)char才能表示。這對(duì)于通過(guò)下標(biāo)來(lái)操作字符串的操作來(lái)說(shuō)是非常痛苦的一件事情。

另外,一個(gè)漢字需要至少3個(gè)char來(lái)表示,也讓漢字在網(wǎng)絡(luò)傳輸上存在劣勢(shì),占用太多流量(但是如果啟用了壓縮,實(shí)際上差別并不大。并且現(xiàn)在很多中文網(wǎng)站都默認(rèn)將編碼從GBK改成了UTF-8)。

UTF-16

優(yōu)勢(shì)

UTF-16 LE是windows上默認(rèn)的Unicode編碼方式,使用wchar_t表示。所有wchar_t *類型的字符串(包括硬編碼在.h/.cpp里的字符串字面值),VC都自動(dòng)采用UTF-16的編碼(字符串字面值,literal string,存在很多坑。特別是char *類型的字面值,最終內(nèi)存使用何種編碼方式完全取決于當(dāng)前文件的編碼方式。也就是說(shuō)當(dāng)前文件如果是GBK編碼的,那么文件里char * str = '中午',str指向的內(nèi)存字符串二進(jìn)制是使用GBK編碼的。如果文件編碼是UTF-8,那么內(nèi)存是使用UTF-8編碼。所以為什么一直要強(qiáng)調(diào)字符串應(yīng)該放在資源文件里,而不是硬編碼在.h/.cpp文件里!)。

UTF-16另外一個(gè)優(yōu)勢(shì)就是常用字符都可以使用兩個(gè)個(gè)字節(jié)表示,也就是一個(gè)wchar_t(這里指Windows平臺(tái))。所以,在Windows平臺(tái)上,特別適合使用wchar_t來(lái)作為字符串的存儲(chǔ)基類型。一個(gè)wchar_t表示一個(gè)字符。操作使用非常方便。

劣勢(shì)

沒(méi)有統(tǒng)一的表示UTF-16編碼的字符類型。C++98/03里對(duì)wchar_t的定義是非常寬泛的。這導(dǎo)致在Windows平臺(tái)上,wchar_t是2字節(jié)的;在Unix-like系統(tǒng)上是4字節(jié)的。代碼移植上,可能會(huì)遇到挑戰(zhàn)(我沒(méi)移植過(guò),所以不確定會(huì)有什么難度,以及難度有多大)。

即使最新的C++11里已經(jīng)定義除了char16_t表示UTF-16,MS的VS2013還不支持char16_t。所以目前使用char16_t還不具移植性。

據(jù)我了解,UTF-16編碼和GBK編碼相比,還存在一個(gè)排序的劣勢(shì)。也就是說(shuō),如果要按照漢語(yǔ)拼音的字母順序?qū)h字進(jìn)行排序,GBK會(huì)得到正確的結(jié)果,而UTF-16就不行(暫時(shí)我還沒(méi)這種需求,所以我沒(méi)驗(yàn)證過(guò),不過(guò)好像我馬上就要與到這種需求了,到時(shí)候我再驗(yàn)證下)。

UTF-16編碼字符串的網(wǎng)絡(luò)傳輸,要考慮大小端的問(wèn)題。另外網(wǎng)絡(luò)傳輸中如果一個(gè)字節(jié)信息丟失,剩下的字符串都無(wú)法正確解析。統(tǒng)統(tǒng)亂碼。

另外,UTF-16并不是定長(zhǎng)類型。所以還是存在生僻字使用4個(gè)字節(jié)編碼而不是2個(gè)字節(jié)(但是Windows有例外。在Windows(NT內(nèi)核)平臺(tái),從MSDN的各種表述來(lái)看,似乎一個(gè)wchar_t就是一個(gè)字符。更多關(guān)于Windows平臺(tái)字符編碼的問(wèn)題參考知乎回答和相關(guān)評(píng)論)。

UTF-32

優(yōu)勢(shì)

這個(gè)優(yōu)勢(shì)就明顯了,所有字符都是4字節(jié),fix-length。一個(gè)wchar_t(Unix-like系統(tǒng)上)表示一個(gè)字符。

劣勢(shì)

對(duì)于以英文為主的字符串來(lái)說(shuō),空間消耗大。

面臨和上面UTF-16一樣的問(wèn)題。一致性,排序,網(wǎng)絡(luò)傳輸,數(shù)據(jù)丟失后無(wú)法恢復(fù)。char32_t VS2013還不支持(甚至VS 14 CPT也沒(méi)打算支持)。

總結(jié)

UTF-8最適合用來(lái)作為字符串網(wǎng)絡(luò)傳輸?shù)木幋a格式。UTF-16最適合當(dāng)作本地字符串編碼格式。如果定義好了網(wǎng)絡(luò)傳輸協(xié)議,那么UTF-16也非常合適當(dāng)作網(wǎng)絡(luò)字符串傳輸?shù)木幋a格式,特別是中文等遠(yuǎn)東地區(qū)字符集。比起UTF-8來(lái)說(shuō),節(jié)省一點(diǎn)點(diǎn)流量。UTF-32沒(méi)什么特殊癖好或者需求的話,暫時(shí)還用不上。

最后,推薦一篇文章:UTF-8 Everywhere。

我個(gè)人覺(jué)得最佳實(shí)踐應(yīng)該是:

  1. Linux上使用char,采用UTF-8編碼。
  2. 網(wǎng)絡(luò)傳輸使用UTF-8編碼。
  3. Windows上使用wchar_t / char16_t,采用UTF-16編碼。將收到的網(wǎng)絡(luò)數(shù)據(jù)統(tǒng)一從UTF-8轉(zhuǎn)碼到UTF-16。在Windows上應(yīng)該銘記沒(méi)有char / std::string這種類型的字符/字符串,只有wchar_t / char16_t / std::wstring / std::u16string。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多