c++ TCHAR轉(zhuǎn)string導(dǎo)致中文缺失或亂碼問題及解決
c++ TCHAR轉(zhuǎn)string導(dǎo)致中文缺失或亂碼
1.確定編碼方式
首先,確定TCHAR字符串的編碼方式。
TCHAR可以表示寬字符,在Unicode編碼環(huán)境中,TCHAR被定義為wchar_t類型;在ANSI編碼環(huán)境下,TCHAR被定義為char類型
2.使用適當(dāng)?shù)暮瘮?shù)進(jìn)行轉(zhuǎn)換
如果TCHAR字符集是ANSI(窄字符)編碼
可以使用wcstombs或者使用CString的簡化方法GetBuffer將TCHAR轉(zhuǎn)換成char數(shù)組,并將該數(shù)組存儲在string中:
std::string ConvertTCHARToString(const TCHAR* tcharString) { char charString[256]; wcstombs(charString, tcharString, sizeof(charString)); return std::string(charString); }
如果TCHAR字符集是Unicode(寬字符)編碼
可以使用WideCharToMultiByte函數(shù)將寬字符轉(zhuǎn)換成窄字符
std::string ConvertTCHARToString(const TCHAR* tcharString) { int bufferSize = WideCharToMultiByte(CP_UTF8, 0, tcharString, -1, nullptr, 0, nullptr, nullptr); std::string result(bufferSize, '\0'); WideCharToMultiByte(CP_UTF8, 0, tcharString, -1, &result[0], bufferSize, nullptr, nullptr); return result; }
如果上述轉(zhuǎn)換方式出現(xiàn)亂碼,可能是TCHAR字符串的保存方式非UTF-8,可以修改CP_UTF8,用對應(yīng)的代碼頁值進(jìn)行轉(zhuǎn)換,
例如,使用CP_ACP可以表示使用當(dāng)前系統(tǒng)的默認(rèn)代碼頁:
std::string ConvertTCHARToString(const TCHAR* tcharString) { int bufferSize = WideCharToMultiByte(CP_ACP, 0, tcharString, -1, nullptr, 0, nullptr, nullptr); std::string result(bufferSize, '\0'); WideCharToMultiByte(CP_ACP, 0, tcharString, -1, &result[0], bufferSize, nullptr, nullptr); return result; }
UE4 C++ FString亂碼顯示問號
如果以"xxx"這種形式并且xxx為中文時,直接賦值給FString的變量會丟失數(shù)據(jù)導(dǎo)致系統(tǒng)無法識別,因此需要做特殊處理。
第一種解決
引號前加L表示將字符串轉(zhuǎn)為unicode的字符串,也就是每個字符占用兩個字節(jié)。
FString str = L"小明";
第二種解決
UTF8_TO_TCHAR,也就是將字符串以UTF8格式保存轉(zhuǎn)為TCHAR,TCHAR再隱式轉(zhuǎn)換為FString。
FString str = UTF8_TO_TCHAR("小紅");
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
在Visual Studio中配置C++最新版netCDF庫的方法
本文介紹在Windows電腦的Visual Studio軟件中,配置C++ 語言最新版netCDF庫的方法,文中通過圖文結(jié)合的形式介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下2024-03-03使用C語言構(gòu)建基本的二叉樹數(shù)據(jù)結(jié)構(gòu)
這篇文章主要介紹了使用C語言使用C語言構(gòu)建基本的二叉樹數(shù)據(jù)結(jié)構(gòu),包括根據(jù)前序序列和中序序列構(gòu)建二叉樹的方法,需要的朋友可以參考下2015-08-08QT基于TCP實(shí)現(xiàn)網(wǎng)絡(luò)聊天室程序
這篇文章主要為大家詳細(xì)介紹了QT基于TCP實(shí)現(xiàn)網(wǎng)絡(luò)聊天室程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08C++實(shí)現(xiàn)訪問者模式的基礎(chǔ)介紹
訪問者模式表示一個作用于某對象結(jié)構(gòu)中各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。對C++訪問者模式相關(guān)知識感興趣的朋友一起看看吧2021-09-09C++begin和end運(yùn)算符的返回迭代器的類型如何判斷?
今天小編就為大家分享一篇關(guān)于C++begin和end運(yùn)算符的返回迭代器的類型如何判斷?,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04C++?Cartographer的入口node main詳細(xì)講解
這篇文章主要介紹了C++Node類Cartographer的入口node main,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03linux下c語言中隱藏進(jìn)程命令行參數(shù)(例如輸入密碼等高危操作)
啟動程序很多時候用命令行參數(shù)可以很方便,做到簡化一些配置,但是輸入用戶名密碼等操作,如果通過進(jìn)程查看工具直接看到密碼就太不安全了,這里就為大家分享一下方法2021-01-01C語言實(shí)現(xiàn)小學(xué)生隨機(jī)出題測試計(jì)分
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)小學(xué)生隨機(jī)出題測試計(jì)分,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03