(C ++)。非unicode语言(简体中文)输入/输出

时间:2015-09-08 01:33:59

标签: c++ chinese-locale

我是编程新手,正在研究C ++教科书中的一些例子。我能够完成大部分示例,但是当我尝试执行以下操作时出现了一些问题:尝试在类似于“Hello World!”的程序中显示中文字符。

  1. 关于这个问题,关于非简体字符(例如简体中文)的输入/输出,我想提供一些关于到目前为止我尝试过的信息:

    我正在运行“Hello world!”代码程序:使用C ++的块,并试图用“你好”中文字符替换文本“Hello world”。我运行程序,但在命令提示符下输出只是乱码(乱码)。所以,我在网上搜索了一些信息,发现我必须将我的区域设置更改为“简体中文”。我做了这个,重新启动了我的电脑并再次运行程序。这一次,程序的输出是非unicode字符,但是,它们是不正确的字符(这些:浣ソand and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and ... ... ... ... ...是“你好”的编码,但我不太确定。我只想让我写的文本(std :: cout<<“--- \ n”;)正确显示,就像我使用英语时一样。如何将它显示在我将在Code:Block上的代码中显示的内容中显示?

  2. 最后,出现了一个提示,表示编码已更改,因为我使用了非法字符......

1 个答案:

答案 0 :(得分:1)

尝试了以下内容:

#include <iostream>

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

我得到了输出:

你好

对我来说,这似乎是相同的角色(如果我没有看到你的不同,我会谦卑地道歉)。这让我觉得问题在于一方面保存文件和/或编译时的字符到字节转换不匹配以及执行期间显示字节到字符的转换。

我的正确输出是使用g ++ 4.8.4在XUbuntu上。 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序列(粗体编码位):

  • 你 - 1110 0100 10 111101 10 100000 - 字符77664
  • 好 - 1110 0101 10 100101 10 111101 - 字符22909

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

此时我必须说我没有足够的信息来帮助你。请考虑提供您尝试编译的确切代码,如果可能的话还要提供十六进制表示。