遇到个编码问题,不是中文库问题,英文系统有该字符,开始比较混乱,一天了才解决:
例如字符:°(经纬度的度符号)
通过
LPCTSTR degree = _T("°");
// 或 代码点(code point)
LPCTSTR degree = _T("/u00B0");
// 对话框中显示
SetDlgItemText(IDC_STA_DEGREE, degree);
以上做法在中文/英文系统中都是正常显示的。
========= 问题
std::string strDeg = "°";
// 转宽字节
WCHAR *wstrDeg = Char2WChar(strDeg.c_str());
SetDlgItemText(IDC_STA_DEGREE, wstrDeg); // 中文系统正常显示,英文系统显示乱码
== 转宽字节
WCHAR* StringUtl::Char2WChar(const char *str)
{
if(!str)
return NULL;
DWORD dwMinSize;
dwMinSize = MultiByteToWideChar (CP_ACP, 0, str, -1, NULL, 0);
wchar_t *pwText;
pwText = new wchar_t[dwMinSize+1];
MultiByteToWideChar (CP_ACP, 0, str, -1, pwText, dwMinSize);
return pwText;
}
问题解决了,按照我自己的理解,问题出在
std::string strDeg = "°";
一开始就错了,所以无论怎么转都是错,或者在中文系统中不会错,但是对于英文系统是错的
所谓不兼容
我的解决办法,因为要保持使用string类型输出,最终还是要得到string类型的结果
std::wstring ws = L"°";
string str = wstring2string(ws); // 输出string
这样在界面显示的时候:
std::wstring ws = string2wstring(str);
SetDlgItemText(IDC_STA_DEG, ws.c_str()); // 支持英文系统正常显示
看起来绕弯了,可能说直接用wstring接口就行了,但是涉及地方太多就用这个小技巧了。