奇思妙想 · 2024年 4月 7日 0

源代码中字符串编码和源代码编码一样吗?

50 次浏览

一般理解,源代码的字符串编码和源代码编码是一样的。比如gcc默认是UTF-8.

以gcc为例,字符串"我"的长度是3, 因为UTF-8的中文是3字节。可以用strlen获取长度,同样也可以利用printf返回值是输出字节数来获取。

使用gcc, 如果源代码是UTF-16LE编码,你会发现"我"的长度依然是3. 原因在于gcc对于字符串保存编码和源代码采用不同的配置,字符串默认编码是UTF-8,不跟随源代码编码。可以通过-fexec-charset=xxx修改字符串保存编码,例如-fexec-charset=GB2312修改字符串编码为GB2312. 这样字符串"我"的长度就会变成2.

需要注意-fexec-charset=不能设置非多字节编码,例如UTF-16LE这种,否则会提示"在执行字符集中不是单字节"的错误。

对于VS,即使源代码编码是UTF-8且工程选项"字符集"设置为"多字节"模式,字符串默认编码依然是ANSI编码(简体中文操作系统对应GB2312),即"我们"将被保存为十六进制CE D2 C3 C7 (数据地址从低到高排列).

VS设置源代码编码和字符串编码选项为:/source-charset和/execution-charset