C/C++字符乱码研究

本文探讨了C/C++字符乱码问题,涉及源文件编码、编译存储编码和执行编码三个阶段。在VC编译器下,不带BOM的UTF8源文件可能被视为ANSI编码,导致乱码。可通过设置/execution-charset:utf-8或使用#pragma execution_character_set("utf-8")来解决。g++和Mingw编译器则通常保持源文件和编译存储编码一致,允许通过参数调整。正确设置执行编码以确保与存储编码一致,能避免乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串显示到UI界面上大致有三个阶段:源文件编码格式、编译存储编码格式、执行编码格式

1,源文件编码格式

我们的C/C++源文件一般有GBK、UNICODE(UTF8、UTF16、UTF32)等编码格式,其中UTF8分为带BOM和不带BOM,BOM其实就是标记双字节或者四字节字符是大端还是小端存储,所以其实UTF8是不需要BOM标记的。VC编译器不认不带BOM的UTF8文件,也就是VC编译器会把不带BOM的UTF8源文件当成ANSI编码处理,这种情况下如果你的代码里的字符串有中文字符肯定会乱码,原因是编译器不能正确转换字符串到存储编码格式。 

2,编译存储编码格式

即编译器将源文件中的字符串常量(例如字符串 "中国" )编译存储到静态存储区中所用的编码格式 ,说明下 :L"中国",u"中国",U"中国" 等字符串常量显示指定了存储编码格式,编译器会按照你指定的去转码存储到静态存储区。 那么 char str[] = "中国" 这种字符串编译存储编码到底用什么格式呢?分两个阶段,首先在编译后字符串"中国"就存在静态存储区,然后运行时用这个内存初始化字符数组;

(1)VC编译器  在在VC下和本地化locale有关,如果你的系统是简体中文那VC编译时会把字符串转成ANSI编码来存储,当然你可以通过指令更改:

方式一,工程属性 》配置属性 》C/C++ 》命令行 》其他选项,在这里输入/execution-charset:utf-8,那么整个工程中的字符串都将转码成UTF8作为存储编码格式;另外在VS2015中还有指令/sourc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值