Charset乱码 android char* 中文乱码

您所在的位置:网站首页 vc中文版打开后为乱码 Charset乱码 android char* 中文乱码

Charset乱码 android char* 中文乱码

2023-06-30 22:37| 来源: 网络整理| 查看: 265

为了解决程序对中文支持不好的问题(如路径不能含中文),强制程序内的char*字符串采用utf8编码。

编码不统一导致的乱码问题

因为历史原因,C/C++语言中char*字符串可能采用各种编码:ASCII, Latin, utf8, GBK...

所有文本文件可用的编码,char*字符串都可以采用。

 

Charset乱码 android 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

 

Charset乱码 android char* 中文乱码_ide_02

 

系统调用的处理

系统提供的函数

命令行输出可对 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