c++ TCHAR轉string導致中文缺失或亂碼問題及解決
c++ TCHAR轉string導致中文缺失或亂碼
1.確定編碼方式
首先,確定TCHAR字符串的編碼方式。
TCHAR可以表示寬字符,在Unicode編碼環(huán)境中,TCHAR被定義為wchar_t類型;在ANSI編碼環(huán)境下,TCHAR被定義為char類型
2.使用適當?shù)暮瘮?shù)進行轉換
如果TCHAR字符集是ANSI(窄字符)編碼
可以使用wcstombs或者使用CString的簡化方法GetBuffer將TCHAR轉換成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ù)將寬字符轉換成窄字符
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; }
如果上述轉換方式出現(xiàn)亂碼,可能是TCHAR字符串的保存方式非UTF-8,可以修改CP_UTF8,用對應的代碼頁值進行轉換,
例如,使用CP_ACP可以表示使用當前系統(tǒng)的默認代碼頁:
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ù)導致系統(tǒng)無法識別,因此需要做特殊處理。
第一種解決
引號前加L表示將字符串轉為unicode的字符串,也就是每個字符占用兩個字節(jié)。
FString str = L"小明";
第二種解決
UTF8_TO_TCHAR,也就是將字符串以UTF8格式保存轉為TCHAR,TCHAR再隱式轉換為FString。
FString str = UTF8_TO_TCHAR("小紅");
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
在Visual Studio中配置C++最新版netCDF庫的方法
本文介紹在Windows電腦的Visual Studio軟件中,配置C++ 語言最新版netCDF庫的方法,文中通過圖文結合的形式介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下2024-03-03C++?Cartographer的入口node main詳細講解
這篇文章主要介紹了C++Node類Cartographer的入口node main,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-03-03linux下c語言中隱藏進程命令行參數(shù)(例如輸入密碼等高危操作)
啟動程序很多時候用命令行參數(shù)可以很方便,做到簡化一些配置,但是輸入用戶名密碼等操作,如果通過進程查看工具直接看到密碼就太不安全了,這里就為大家分享一下方法2021-01-01