男女做爽爽爽网站-男女做羞羞高清-男女做爰高清无遮挡免费视频-男女做爰猛烈-男女做爰猛烈吃奶啪啪喷水网站-内射白浆一区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

UTF-8 vs UTF-16兩種格式有何異同

admin
2025年4月19日 21:51 本文熱度 243

之前,介紹了UTF-8UTF-16,實(shí)際上還有UTF-32這個名稱就知道是什么意思了,因?yàn)閼?yīng)用不廣,所以就不展開說了。

注:如果后面提到的一些細(xì)節(jié),可能需要先看過,介紹UTF-16 和 介紹UTF-8
先說一個共同點(diǎn):UTF-8和UTF-16都是變長編碼,因?yàn)閁TF-16是變長編碼(每個字符為2字節(jié)或4字節(jié))這事很少被提及。
看標(biāo)題應(yīng)該也能猜到,我們主要說的是UTF-8和UTF-16的差別。但在說這個之前,我們要考慮,程序真正使用的編碼是什么?是Unicode嗎?實(shí)際上并不會真的使用Unicode(除非是UTF-32),而是使用UTF-8或UTF-16等(這就和GB2312編碼中真實(shí)使用的都是GB2312內(nèi)碼一樣)
先考慮它們使用空間的差別。
UTF-16雖然是變長,但實(shí)際上Unicode基本多文種面(0號面)的使用頻率非常高,這導(dǎo)致了UTF-6的編碼長度基本等于字符數(shù)的2倍。
UTF-8編碼中,一個字符長度為1~4字節(jié)不等(Unicode目前最長為21位,所以不會使用介紹的5~6字節(jié))

  • 英文字母和數(shù)字都是1字節(jié)
  • 歐洲的拉丁字母等基本都是2字節(jié)
  • 中文等基本都是3字節(jié)
  • Unicode編碼的1號面~16號面為4字節(jié)

這樣實(shí)際上,UTF-8編碼的一個字符基本是1~3字節(jié),具體的使用概率應(yīng)該和用戶相關(guān)(就是用戶主要使用那種語言)
我們知道:Windows操作系統(tǒng)使用的是UTF-16編碼,Linux操作系統(tǒng)使用的是UTF-8編碼。這里分析一下它們各自的選擇邏輯,微軟是為了賣給全世界的,所以它選擇了UTF-16,例如,Java等也是使用了UTF-16。但Linux不同,它是開源的,早期的開發(fā)者都是歐美的,選擇UTF-8使用的空間一定不比UTF-16差(哪怕是拉丁字母占比更多,也就是和UTF-16持平,只有中文等字符占比多的情況下才會出現(xiàn)UTF-16更優(yōu)的)。
在使用的時候,有時需要UTF-8和UTF-16相互轉(zhuǎn)換,因?yàn)樗鼈冇幸?guī)律,是可以相互轉(zhuǎn)換的。但是,如果需要GB18030和UTF-8相互轉(zhuǎn)換,就沒有可以終結(jié)的規(guī)律了。所以,這里就不介紹UTF-8和UTF-16相互轉(zhuǎn)換的代碼了,編碼的相互轉(zhuǎn)換可以使用iconv(參考附錄三)
在源碼的編碼上,推薦使用UTF-8,此時使用MSVC編譯,添加一個參數(shù) /utf-8
傳輸協(xié)議的文本編碼方案,要優(yōu)先考慮兼容性,然后再考慮節(jié)省空間。
最后,說一下Windows上的編碼問題,內(nèi)核使用的是UTF-16編碼,但很多API,都提供了A版和W版,例如,CreateFile這個API,實(shí)際上提供了CreateFileA和CreateFileW兩個版本,而CreateFile實(shí)際上是一個宏。但是有個別API只有W版的,更有甚者,W版和A版的功能(或效果)不完全一致,所以,如果可以,盡量使用W版本的。
Windows的應(yīng)用程序主要有兩種(Console和Windows,VS界面設(shè)置里在Linker->SubSystem中)。Console的默認(rèn)編碼通常并不是UTF-16,中文系統(tǒng)默認(rèn)為代碼頁936(這個可以看之前的文章,代碼頁GB2312GBK等),這個默認(rèn)編碼通常稱為本地編碼。本地編碼和UTF-16的相互轉(zhuǎn)化可以使用下面的系統(tǒng)API:

  • MultiByteToWideChar
  • WideCharToMultiByte

注意,這兩個API的用法和iconv差異挺大的,微軟的API文檔很完整,這里就不展開了。非必要,Windows上不用iconv,這個看附錄三。
附錄:
附錄一
Linux的編碼使用UTF-8的一個好處,就是內(nèi)核裁剪上有那么一點(diǎn)點(diǎn)優(yōu)勢----就是剪裁到嵌入式系統(tǒng)的層度。
附錄二
關(guān)于信創(chuàng)系統(tǒng)的編碼,目前基本都是UTF-8編碼。我能想到的兩個原因:
1. 修改系統(tǒng)層面的編碼節(jié)省的空間和現(xiàn)在計(jì)算機(jī)硬件相比,實(shí)際上已經(jīng)沒那么重要了
2. 能夠更大層度的兼容當(dāng)前的軟件。這里的兼容主要是指二進(jìn)制的兼容,就是第三方軟件不需要重新編譯就可以運(yùn)行。
附錄三
關(guān)于iconv這個庫,需要注意函數(shù)iconv,一共5個參數(shù),第二和第三兩個參數(shù)共同組成一個內(nèi)存段(內(nèi)存起點(diǎn)指針和長度)第四和第五兩個參數(shù)共同組成一個內(nèi)存段。它對內(nèi)存段的使用有一點(diǎn)特別,都是傳入傳出參數(shù)(即是入?yún)⒁彩浅鰠?。無論函數(shù)是否成功,內(nèi)存段都會變?yōu)槭S嗟牟糠郑e例,下面示例代碼:
// 示例代碼1
#include <iconv.h>

int main()
{
    // 編碼轉(zhuǎn)換的源編碼文本
    constchar utf8[] = "幻想";
    // 轉(zhuǎn)換后的編碼的儲存位置
    char buff[20] = { 0 };
    // in_size值是7, 如果使用strlen則是6,都可以
    size_t in_size = sizeof(utf8);
    // 這里是 UTF-8 轉(zhuǎn) GB2312
    iconv_t co = iconv_open( "GB2312""UTF-8");
    do {
        if (co == (iconv_t)(-1)) {
            // iconv_open失敗
            break;
        }
        // 這里一定要使用一個新的指針變量,iconv函數(shù)不能直接使用變量 utf8
        // 因?yàn)?utf8 作為一個指針,是不能修改的,這不符合iconv的用法
        char* in_buff = (char*)(utf8);
        // 輸出內(nèi)存段的起始位置
        size_t out_size = sizeof(buff);
        // 這里也需要使用一個新的指針變量
        char* out_buff = (char*)(buff);
        // 在iconv執(zhí)行前:
        // in_buff == utf8 而且 out_buff == buff
        size_t result = iconv(co, &in_buff, &in_size, &out_buff, &out_size);
        // 在iconv執(zhí)行前:
        // in_buff != utf8 而且 out_buff != buff
        // 通常為 in_buff > utf8 而且 out_buff > buff
        // 并且 in_size 和 out_size 的值也會變小
        // -------------------
        // GB2312的編碼結(jié)果存在的內(nèi)存起點(diǎn)為 buff, 長度為 sizeof(buff) - out_size
        // result == (iconv_t)(-1) 為失敗
    } while(false);
    if (co != (iconv_t)(-1)) {
        // 這里回收 iconv_open 的資源
        iconv_close(co);
    }
}
上面代碼如果編譯,記得鏈接iconv庫
在linux和mac上,基本都是默認(rèn)安裝了iconv庫的。如果在Windows上需要使用iconv,可以參考下面文檔:
https://www.codeproject.com/Articles/302012/How-to-Build-libiconv-with-Microsoft-Visual-Studio?


閱讀原文:原文鏈接


該文章在 2025/4/21 10:32:56 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产亚洲精品久久久久久移动网络 | 国产肥熟女视频一区二区 | A片A三女人久久7777 | 一本久道久久综合狠狠躁AV | 久久久久亚洲v片无码v | 无码av中文一区 | 国内自拍真实伦在线观看视频 | 精品国产乱码久久久久久青草 | 一区二区三区精密机械公司 | 国产精品乱码色情一区二区视频 | 国产丝袜足脚 | 欧美午夜伦y448 | 国产一区二区三区亚洲欧美 | 色欲AV亚洲情无码AV蜜桃 | 国产三级av无码在线一区 | videos另类重口tv | 妺妺窝人体色网站 | 免费少妇a级毛片 | 欧美黄 | 97制片厂爱豆传媒视频 | 国产日韩久久久久精品 | 国产三级视频在线观看 | 成人a片午夜福利在线观看 成人a片一二三区免费观看乱码小说 | 国产丰满人妻AV | 精品国产成人综合久久小说 | 性色av综合在线观看精品 | 潮喷好爽在线观 | 国内精品一区无码中文在线 | 激情六月综合 | 亚洲综合无码日韩国产加勒比 | 日本亚欧乱色视频在线观看 | 久久综合精品国产一区二区三区无码 | 国内自拍一二三四2024 | 人妻少妇系列在线观看 | 色欲人妻AV久久无码精品 | 人妻去按摩店被黑人按中出 | 欧美午夜a级限制福利片 | 一级特黄AAA大片在线观看 | 日韩网红少妇无码视频香港 | 国产做爰又粗又大太疼了 | 欧美日韩一区二区成人 |