(c++).非unicode语言(简体中文)输入/输出

(C++). Non-unicode language (Simplified Chinese) input/output

本文关键字:输入 输出 简体中文 unicode c++ 语言      更新时间:2023-10-16

我是一个编程新手,正在编写我的c++教科书中的一些示例。我能够完成大多数示例,但是当我尝试执行以下操作时,出现了一些问题:试图在类似于"Hello World!"的程序中显示中文字符。

  1. 关于输入/输出非unicode字符(如简体中文)的问题,我想提供一些我迄今为止所尝试的信息:

    我使用c++在Code:Blocks上运行"Hello world!"程序,并试图将文本"Hello world"替换为中文字符"。我运行了这个程序,但是在命令提示符中输出的只是胡言乱语。所以,我在网上搜索信息,发现我必须把我的地区设置改为"简体,中国"。我这样做了,重新启动了我的电脑,再次运行程序。这一次,程序的输出是非unicode字符,然而,它们是不正确的字符(这些:犲锛),我也相信它也是日语……互联网上的一些中文资源说这是"中文"的编码,但我不太确定。我只需要我写在(std::cout <<)后面的文本"——n";)正确显示,就像我使用英语时一样。我怎样才能让它显示我在命令提示符上的代码块中所写的内容?

最后,弹出一个提示,说明编码被更改了,因为我使用了非法字符…

尝试了以下操作:

#include <iostream>
int main()
{
        std::cout << "你好" << std::endl;
        return 0;
}

我得到了输出:

你好

对我来说似乎是相同的字符(如果我没有看到你所做的区别,我谦卑地道歉)。这使我认为问题在于保存文件和/或编译时的字符到字节转换与执行期间的显示字节到字符转换不匹配。

我的正确输出是在XUbuntu上使用g++ 4.8.4。cpp文件是用vim保存的,它看起来像这样:

 00000000:  23 69 6e 63 6c 75 64 65  20 3c 69 6f 73 74 72 65  #include <iostre
 00000010:  61 6d 3e 0a 0a 69 6e 74  20 6d 61 69 6e 28 29 0a  am>..int main().
 00000020:  7b 0a 09 73 74 64 3a 3a  63 6f 75 74 20 3c 3c 20  {..std::cout << 
 00000030:  22 e4 bd a0 e5 a5 bd 22  20 3c 3c 20 73 74 64 3a  "......" << std:
 00000040:  3a 65 6e 64 6c 3b 0a 09  72 65 74 75 72 6e 20 30  :endl;..return 0
 00000050:  3b 0a 7d 0a -- -- -- --  -- -- -- -- -- -- -- --  ;.}.------------

正如你所看到的,每个字符被保存为一个3字节的UTF-8序列(黑体显示的编码位):

  • * * - 11100100 10111101 10100000 -字符77664
  • 11100101 10100101 10111101 -字符22909

因为有一次你得到了4个字符的文本,我相信这些字节实际上被编译为UTF-8很好,但随后被读取为其他东西。如果它们被读取为UTF-16,那将尝试生成3个字符(每个字符2字节),但这是不可能的情况,因为标准是以避免这种混淆的方式创建的,而且因为您实际上有4个字符,并且UTF-16不可能使用少于2个字节来生成一个字符。

在这一点上,我必须说我没有足够的信息来进一步帮助你。请考虑提供您要编译的确切代码,如果可能的话,还应提供它的十六进制表示。