3.2. Hello world 中文版
“Hello world”中文版是一个小小的插曲。作为一个中国人,怎么可以不用充满魅力的方块字来向世界问声好呢?
(背景歌声响起:“北京欢迎你,像音乐感动你……”)。
3.2.1. 理解“编码”及“字符集”
- 编码
不过,要向控制台输出一些汉字,这里面有个重要的问题。我们曾经说过,在计算机中,一切数据最终都是用二进制数表示的。这里倒不是二进制出什么问题了,无论 是二进制,还是十进制,表达的都是“数”。因此,具体到“汉字”这件事,问题就出来了,比如,“庄”这个汉字,在计算机,是用“55215”来表达呢?还 是用“15711167”好呢?
结论是:一个生活中的字符,在计算机用什么数值来表达呢,这就叫做“编码”问题。
- 字符集
正好相反,当程序得到一大串数字,它是在表达一段汉字呢?还是一段朝鲜文字?这叫“字符集”问题。
3.2.2. 问题与解决
中文版的Windows操作系统,它的控制台通常是采用一种名为“GBK”的编码。而我们用来写代码的Code::Blocks,则采用名为“utf-8” 的编码。如此,当我在Code::Blocks里写代码时,输入一个“庄”字,实际保存的可能是“15711167”这个数字,可以是这个数输出到 Windows的控制台时,它却会把它“翻译”成一个古怪的汉字:“搴”,甚至干脆就“译”不出来。
解决办法很多,今天我们采用最简单的办法。Code::Blocks其实支持多种编码,我们把main.cpp文件的编码,也改成GBK即可。不想跟Windows的控制台怄气。
- 新建项目
请使用Code::Blocks向导,新建一个控制台应用,项目名称为“HelloWorldCn”。
如果您之前没有关闭第一个版本的HelloWorld,那么,现在Code::Blocks会同时打开两个项目,此时您可以通过双击来激活指定项目:如下图:
(图 11 激活指定项目)
〖危险〗:确认所修改的文件隶属于活动项目
由于本例子每个项目的源文件都取名为main.cpp。因此,在本例,以及后面更多的Hello World例子中,请多加小心,一定认清你正在修改的main.cpp,是属于当前活动的项目;否则,您可能会惊讶地发现,无论如何修改源代码,编译后的程序却不受影响。
- 修改文件编码
确定main.cpp文件当前采用的编码是什么,方法是查看用Code::Blocks打开main.cpp文件时,查看此时的状态栏,如下图:
(图 12 查看源代码当前编码:UTF-8.)
如果您看到的是“UTF-8”,那就需要更改,请进行下一步。
请点击主菜单“编辑”→“文件编码”→“系统默认”。本步完成后,状态栏显示当前编码为“WINDOWS-936”(GBK的别名)。
(图 13修改后的源文件编码:WINDOWS-936)
- 修改代码
完成以上步骤,我们现在可以放心地修改007行的代码了:
cout << "你好,世界!" << endl;
记得重新编译:Ctrl + F9。然后运行。结果如下:
(图 14 你好,世界!)
〖小提示〗:UTF-8 VS. GBK
同样这份代码,如果要在Linux编译,可能就需要再次将编码改回UTF-8。注意一个细节:同样是“庄”字,utf-8用一个远大于GBK编码值的整数表 示。事实上,utf-8编码对应到一个非常大的字符集,这个“大字符集”包括了西方字符、汉字简体、汉字繁体、日语等等。而GBK则只能表达西方字符以及 2万多个汉字。
从这点考虑,如果您在同一个源代码文件中,又要用到汉字,又要用到日语,GBK编码就无法胜任。这种情况下,我们就得别想办法来避免和中文版Windows控制台怄气了。
-------------------------------------
如果您想与我交流,请点击如下链接成为我的好友:
http://student.csdn.net/invite.php?u=112600&c=f635b3cf130f350c