日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > strongerHuang
[導(dǎo)讀]本文介紹了如何在最常見的編碼方式(Unicode, UTF-8, ANSI)之間進行轉(zhuǎn)換,結(jié)合代碼實例,清晰明了,方便讀者理解,例子也可以直接拿來使用。

關(guān)注、星標公眾,不錯過精彩內(nèi)容

作者:FlushHip

在處理東方語言(中日韓)時,經(jīng)常會遇到各種編碼問題,而且被這類問題搞的暈頭轉(zhuǎn)向。到網(wǎng)上查資料,看的也是一頭霧水,最后往往是誤打誤撞的把問題解決了,自己仍然稀里糊涂。


這篇文章介紹了如何在最常見的編碼方式(Unicode, UTF-8, ANSI)之間進行轉(zhuǎn)換,結(jié)合代碼實例,清晰明了,方便讀者理解,例子也可以直接拿來使用。本文推薦給經(jīng)常對文字字符串進行處理的程序員閱讀,使其掌握字符轉(zhuǎn)換的一些基本方法。


正文

------------?strongerHuang?------------


C++的項目,字符編碼是一個大坑,不同平臺之間的編碼往往不一樣,如果不同編碼格式用一套字符讀取格式讀取就會出現(xiàn)亂碼。因此,一般都是轉(zhuǎn)化成UTF-8這種平臺通用,且支持性很好的編碼格式。

Unicode、UTF-8的概念不做過多解釋,這里說一下ANSI,我第一次看到這個名詞,我看成了ASCII。被Mentor狠批一頓。


ANSI是一種字符代碼,為使計算機支持更多語言,通常使用 0x00 ~ 0x7F范圍的1 個字節(jié)來表示 1 個英文字符。超出此范圍使用0x80~0xFFFF來編碼,即擴展的ASCII編碼。


不同的國家和地區(qū)制定了不同標準,由此產(chǎn)生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的編碼標準。這些使用多個字節(jié)來代表一個字符的各種漢字延伸編碼方式,稱為 ANSI 編碼。在簡體中文Windows操作系統(tǒng),ANSI 編碼代表 GBK 編碼;在繁體中文Windows操作系統(tǒng),ANSI編碼代表Big5;在日文Windows操作系統(tǒng),ANSI 編碼代表 Shift_JIS 編碼。

以上內(nèi)容摘自百度百科,可以看出,ANSI和ASCII還是有關(guān)系的。ANSI也叫本地碼。

我們要做到能在Unicode、UTF-8、ANSI這三種編碼格式中自由轉(zhuǎn)換。如下圖所示:


在C++中,要怎么做呢?當(dāng)然是用標準庫的東西啦,C++11對國際化標準做得還是可以的,提供了這些接口,正如圖中虛線所示,標準庫沒有提供UTF-8到ANSI的互相轉(zhuǎn)化接口,但是我們可以自己封轉(zhuǎn)接口,借用這條路(UTF-8 <=> Unicode <=> ANSI)來實現(xiàn)。


因此,接下來就聊聊UTF8 <=> Unicode和Unicode <=> ANSI。


UTF8 <=> Unicode

------------?strongerHuang?------------


先看代碼:

std::string UnicodeToUTF8(const std::wstring & wstr){ std::string ret; try { std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv; ret = wcv.to_bytes(wstr); } catch (const std::exception & e) { std::cerr << e.what() << std::endl; } return ret;}std::wstring UTF8ToUnicode(const std::string & str){ std::wstring ret; try { std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv; ret = wcv.from_bytes(str); } catch (const std::exception & e) { std::cerr << e.what() << std::endl; } return ret;}


UTF-8是多字節(jié)字符串(multibyte string),而Unicode是寬字符字符串(wchar_t string)。


而C++11提供了wstring_convert這個類,這個類可以在wchar_t string和multibyte string之間來回轉(zhuǎn)換;


而codecvt_utf8可以提供UTF-8的編碼規(guī)則。這個類在#include 中。有了wstring_convert提供寬字符字符串到多字節(jié)字符串的轉(zhuǎn)化,而這個轉(zhuǎn)換規(guī)則由codecvt_uft8提供。這樣子就可以實現(xiàn)UTF8和Unicode的互相轉(zhuǎn)換。


  • 從UTF8到Unicode調(diào)用成員函數(shù)wstring_convert::from_bytes;

  • 從Unicode到UTF8調(diào)用成員函數(shù)wstring_convert::to_bytes;


Unicode <=> ANSI

------------?strongerHuang?------------


std::string UnicodeToANSI(const std::wstring & wstr){ std::string ret; std::mbstate_t state = {}; const wchar_t *src = wstr.data(); size_t len = std::wcsrtombs(nullptr, &src, 0, &state); if (static_cast<size_t>(-1) != len) { std::unique_ptr< char [] > buff(new char[len + 1]); len = std::wcsrtombs(buff.get(), &src, len, &state); if (static_cast<size_t>(-1) != len) { ret.assign(buff.get(), len); } } return ret;}std::wstring ANSIToUnicode(const std::string & str){ std::wstring ret; std::mbstate_t state = {}; const char *src = str.data(); size_t len = std::mbsrtowcs(nullptr, &src, 0, &state); if (static_cast<size_t>(-1) != len) { std::unique_ptr< wchar_t [] > buff(new wchar_t[len + 1]); len = std::mbsrtowcs(buff.get(), &src, len, &state); if (static_cast<size_t>(-1) != len) { ret.assign(buff.get(), len); } } return ret;}


標準庫提供了wcsrtombs和mbsrtowcs這兩個函數(shù),當(dāng)然C的標準庫也提供了這兩個函數(shù)。


講下wcsrtombs,這個函數(shù)把寬字符串轉(zhuǎn)成多字節(jié)字符串。編碼規(guī)則受地域的LC_CTYPE影響。因此這個函數(shù)可以用于本地碼的轉(zhuǎn)化(和本地的編碼息息相關(guān))。


因此,有關(guān)于本地碼的使用,在代碼中要加上下列語句:


setlocale(LC_CTYPE, "");


目的是讓本地碼生效,這條代碼的作用就是讓C++語言的Locale(地域)和本地的地域相同。在Linux下可以運行l(wèi)ocale命令看看:

可以看到,LC_CTYPE = en_US.UTF-8,這表示英文,英國,UTF-8編碼,也就是說本地碼就是這個。


當(dāng)然,你也可以在setlocale中指定一些編碼規(guī)則,把wcsrtombs用于別的編碼轉(zhuǎn)化,但是,這里不推薦,因為setlocale是全局的,設(shè)置了這個就會影響其他地方的編碼。

wcsrtombs的四個參數(shù)分別代表什么意思呢?


std::size_t wcsrtombs( char* dst, const wchar_t** src, std::size_t len, std::mbstate_t* ps );


  • dst,轉(zhuǎn)化后的結(jié)果存入dst指向的內(nèi)存;

  • src,待轉(zhuǎn)化的字符串的指針的指針;

  • len,dst指向內(nèi)存的可用字節(jié)數(shù);

  • ps,轉(zhuǎn)換的狀態(tài),一般默認初始化就好了;

  • return type,轉(zhuǎn)化后結(jié)果的長度,不包含\0。


注意:如果dst == nullptr,這個時候wcstombs的返回值表示會有這么多字節(jié)的結(jié)果產(chǎn)生,因此,我們可以拿到這個返回值去新建一個數(shù)組來存儲new char[len + 1]。所以,一般調(diào)用兩次wcstombs。


mbsrtowcs同理。


UTF-8 <=> ANSI

------------?strongerHuang?------------


以Unicode為中介裝換便是。

std::string UTF8ToANSI(const std::string & str){ return UnicodeToANSI(UTF8ToUnicode(str));}std::string ANSIToUTF8(const std::string & str){ return UnicodeToUTF8(ANSIToUnicode(str));}


總結(jié)

------------?strongerHuang?------------


C++11的標準庫還是挺強大的,雖然這么強大,但是很多特性還不了解,因此還是要多擴寬自己的視野,不然有好東西都不知道用,那就棒槌了。


對了,在Linux下加上setlocale(LC_CTYPE, "")后程序在命令行中可以正常顯示,不加有可能不正常顯示,原因是setlocale(LC_CTYPE, "")也影響了cout,全局的嘛;而在CodeBlocks下不能正常顯示,不知道為什么,但是調(diào)試的過程中,觀察到了正常的結(jié)果;Visual Studio中沒有做實驗,不過應(yīng)該沒問題。

來源:

https://blog.csdn.net/flushhip/article/details/82836867


推薦閱讀:

手把手教你用STM32Trust生成加密固件

HAL庫中do{} while(0U)宏定義的作用和意義

FreeRTOS如何減少RAM占用空間并加快執(zhí)行速度


關(guān)注 微信公眾號『strongerHuang』,后臺回復(fù)“1024”查看更多內(nèi)容,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。


長按前往圖中包含的公眾號關(guān)注

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀

全球嵌入式技術(shù)領(lǐng)域的年度盛會2026嵌入式世界展(Embedded World 2026,簡稱EW26)于3月10日至12日在德國紐倫堡成功舉辦。作為物聯(lián)網(wǎng)和邊緣AI領(lǐng)域的領(lǐng)先企業(yè),Silicon Labs(亦稱“芯科科...

關(guān)鍵字: 物聯(lián)網(wǎng) 邊緣AI 嵌入式

3月10日至12日,2026年嵌入式世界展(Embedded World 2026,簡稱EW26)在德國紐倫堡展覽中心成功舉辦。作為領(lǐng)先的邊緣AI與智能音頻等媒體處理技術(shù)和芯片解決方案提供商,XMOS以沉浸式演示與技術(shù)交...

關(guān)鍵字: 邊緣AI 智能音頻 嵌入式

在嵌入式系統(tǒng)開發(fā)中,SoC(System on Chip)的多樣性始終是橫亙在開發(fā)者面前的難題。以某工業(yè)物聯(lián)網(wǎng)網(wǎng)關(guān)項目為例,其需同時支持NXP i.MX8M、Rockchip RK3566和Allwinner H616三...

關(guān)鍵字: Platform Driver模型 嵌入式

在非易失性存儲器領(lǐng)域,EEPROM(電可擦除可編程只讀存儲器)曾長期占據(jù)主流地位,廣泛應(yīng)用于各類電子設(shè)備的參數(shù)存儲、日志記錄等場景。但隨著工業(yè)控制、汽車電子、醫(yī)療設(shè)備等領(lǐng)域?qū)Υ鎯π阅芴岢龈咭?,F(xiàn)RAM(鐵電隨機存取存...

關(guān)鍵字: 存儲器 可編程 嵌入式

康佳特將aReady.COM擴展至Arm架構(gòu)模塊,基于恩智浦i.MX 95處理器打造應(yīng)用就緒的軟硬件構(gòu)建模塊,集成操作系統(tǒng)、系統(tǒng)整合與IoT連接能力,賦能高價值應(yīng)用快速落地

關(guān)鍵字: 處理器 IoT 嵌入式

3月12日,2026年中國家電及消費電子博覽會(以下簡稱:AWE 2026)在上海盛大開幕。展會現(xiàn)場,場景化、系統(tǒng)化、一體化的家電解決方案成為行業(yè)焦點,消費者對家電的關(guān)注也已從基礎(chǔ)的尺寸匹配,延伸至對“空間秩序感”和“視...

關(guān)鍵字: 消費電子 蒸烤箱 嵌入式

超高效NPU IP在資源受限設(shè)備中推進邊緣AI,因而獲得認可

關(guān)鍵字: 人工智能 嵌入式 NPU

上海2026年3月12日 /美通社/ -- 3月12日,2026中國家電及消費電子博覽會(AWE 2026)在上海新國際博覽中心和東方樞紐國際商務(wù)合作區(qū)展區(qū)正式啟幕。本屆展會以"AI科技?慧享未來"為...

關(guān)鍵字: 西門子 博世 嵌入式 洗碗機

在“AI科技,慧享未來”的時代命題下,人工智能正加速滲透至家庭生活的每一個細節(jié)。2026年中國家電及消費電子博覽會(AWE2026)在上海啟幕,聚焦AI技術(shù)如何重塑家電形態(tài)與人居體驗。圍繞“智造不凡 悅享非凡”主題,西門...

關(guān)鍵字: 嵌入式 冰箱 AI
關(guān)閉