c++ TCHAR轉(zhuǎn)string導(dǎo)致中文缺失或亂碼問(wèn)題及解決
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的簡(jiǎn)化方法GetBuffer將TCHAR轉(zhuǎn)換成char數(shù)組,并將該數(shù)組存儲(chǔ)在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,用對(duì)應(yīng)的代碼頁(yè)值進(jìn)行轉(zhuǎn)換,
例如,使用CP_ACP可以表示使用當(dāng)前系統(tǒng)的默認(rèn)代碼頁(yè):
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亂碼顯示問(wèn)號(hào)
如果以"xxx"這種形式并且xxx為中文時(shí),直接賦值給FString的變量會(huì)丟失數(shù)據(jù)導(dǎo)致系統(tǒng)無(wú)法識(shí)別,因此需要做特殊處理。
第一種解決
引號(hào)前加L表示將字符串轉(zhuǎn)為unicode的字符串,也就是每個(gè)字符占用兩個(gè)字節(jié)。
FString str = L"小明";
第二種解決
UTF8_TO_TCHAR,也就是將字符串以UTF8格式保存轉(zhuǎn)為TCHAR,TCHAR再隱式轉(zhuǎn)換為FString。
FString str = UTF8_TO_TCHAR("小紅");
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
c++ 對(duì)數(shù)器實(shí)現(xiàn)示例
對(duì)數(shù)器用于在自己的本地平臺(tái)驗(yàn)證算法正確性,本文詳細(xì)的介紹了c++ 對(duì)數(shù)器實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
C/C++中接收return返回來(lái)的數(shù)組元素方法示例
return是C++預(yù)定義的語(yǔ)句,它提供了種植函數(shù)執(zhí)行的一種放大,最近學(xué)習(xí)中遇到了相關(guān)return的內(nèi)容,覺(jué)著有必要總結(jié)一下,這篇文章主要給大家介紹了關(guān)于C/C++中如何接收return返回來(lái)的數(shù)組元素的相關(guān)資料,需要的朋友可以參考下。2017-12-12
Qt項(xiàng)目實(shí)戰(zhàn)之實(shí)現(xiàn)多文本編輯器
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)簡(jiǎn)易的多文本編輯器,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2023-03-03
C++11可變參數(shù)模板的具體實(shí)現(xiàn)
C++11引入的可變參數(shù)模板是一項(xiàng)非常強(qiáng)大的特性,它極大地提升了模板的擴(kuò)展性,可變參數(shù)模板允許我們定義可以接受任意數(shù)量和類型參數(shù)的模板,這在處理不定數(shù)量參數(shù)的場(chǎng)景中非常有用,感興趣的可以了解一下2025-06-06
淺析設(shè)計(jì)模式中的代理模式在C++編程中的運(yùn)用
這篇文章主要介紹了設(shè)計(jì)模式中的代理模式在C++編程中的運(yùn)用,代理模式最大的好處就是實(shí)現(xiàn)了邏輯和實(shí)現(xiàn)的徹底解耦,需要的朋友可以參考下2016-03-03
淺談C++內(nèi)存分配及變長(zhǎng)數(shù)組的動(dòng)態(tài)分配
下面小編就為大家?guī)?lái)一篇淺談C++內(nèi)存分配及變長(zhǎng)數(shù)組的動(dòng)態(tài)分配。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09

