你是否遇到过C语言或者Java程序中的汉字字符串输出为乱码的现象,也许你去查询过解决办法,得到的结论就是简单地把源码文件转换为GBK编码存储,然而并未深思其中的原因。本文会解释其原因以及正确的应对方式(不转换源码的编码)。首先明确本文的操作环境:Windows操作系统(中文)、C语言编译器为MinGW-GCC。下面给出两个示例程序:
// a.c(utf-8)
#include <stdio.h>
int main(void)
{
printf("%s", "你好");
return 0;
}
// a.java(utf-8)
public class a {
public static void main(String[] args) {
System.out.println("你好");
}
}
以上源码文件均使用UTF-8编码,然后我们打开PowerShell,编译两个文件:gcc a.c、javac a.java,然后运行:.\a.exe、java a,会发现输出的均不是“你好”,而是乱码的“浣犲ソ”。实际上,以UTF-8编码的“你好”和以GBK编码的“浣犲ソ”的二进制序列是一样的(E4 BD A0 E5 A5 BD),你发现其中端倪了吗?