Charset乱码 android char* 中文乱码 |
您所在的位置:网站首页 › vc中文版打开后为乱码 › Charset乱码 android char* 中文乱码 |
为了解决程序对中文支持不好的问题(如路径不能含中文),强制程序内的char*字符串采用utf8编码。 编码不统一导致的乱码问题因为历史原因,C/C++语言中char*字符串可能采用各种编码:ASCII, Latin, utf8, GBK... 所有文本文件可用的编码,char*字符串都可以采用。
图1 VSCode支持几十种文本编码
如果代码中混用两种编码A和B,导致采用A编码的char*字符串被用B编码解析,得到的字符串就可能出现乱码。 一般纯ASCII字符不会发生乱码,因为绝大部分编码的0-127部分的字符都和ASCII编码兼容。 当我们代码里有非ASCII字符的编码时,统一编码就显得非常有必要。 char*编码要求采用UTF8 目前最通用的char*编码为utf8编码,utf8编码被Python、Linux等设置为默认编码。 Windows在不同语言的版本中,char*的默认编码是当前国家的特定编码,比如中文版采用GBK编码。 Windows内核使用的编码为utf16编码的wchar_t*字符串,调用Windows API传入的char*字符串会被先转换为wchar_t*字符串后再调用Unicode版本的API。
GBK编码存在不能表示某些字符的问题,utf8可表示所有字符。
为了解决编码混乱问题,C++20专门为utf8编码新增了std::u8string和char8_t类型。 很多第三方库也支持utf8编码(当然还有部分不支持)
综上 后续产品中的自有C++代码的char*字符串采用utf8编码Windows API只使用Unicode版本在遇到不支持utf8编码的库时,对其进行接口封装(编码转换)建议函数的形参添加_u8后缀,以便调用者快速确认编码要求字符串的编码设置 在定义字符串时,采用以下方法来指定char*字符串为utf8编码 // 在VS2010及之后版本,支持设置字符串为UTF8编码 #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #endif // 在VS2015及之后版本,支持配置编译选项:/execution-charset:utf-8 // 等同项目中所有cpp文件包含上述指令 // 默认str1为GBK编码字符串,进行以上的设置后,str1为utf8编码 const char* str1 = "中文字符串"; // 在VS2015后的版本,只需为字面量添加u8前缀即可得到utf8编码的字符串 // 但Qt的翻译更新功能不认u8前缀,导致ts文件内不包含tr(u8"abc")形式的字符串 const char* str2 = u8"中文字符串"; // Linux系统默认采用utf8编码,无需做额外工作
采用VS2015及之后版本开发的产品中,建议设置编译选项:/execution-charset:utf-8
系统调用的处理 系统提供的函数 命令行输出可对 printf / wprintf / std::cout 进行封装以便输出utf8字符串直接输出std::wstring// 程序启动时,需要初始化Locale以便输出宽字符 setlocale(LC_ALL, ""); // 输出std::wstring至命令行 std::wstring wstr = L"中文字符串"; std::wcout |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |