特殊字符英文系统显示乱码

 

遇到个编码问题,不是中文库问题,英文系统有该字符,开始比较混乱,一天了才解决:
例如字符:°(经纬度的度符号)

通过
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接口就行了,但是涉及地方太多就用这个小技巧了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值