C ++ String对象错误的字符

时间:2017-05-01 19:15:21

标签: c++

我有以下代码:

#include <iostream>
#include <cstdlib>

int main(){
  string letra = "méxico";

  for(int i=0;i<letra.size();i++){
    cout << letra[i] << endl;
  }

  return 0;
}

我得到的结果是:

m
�
�
x
i
c
o

为什么要7个字符而不是6个?如果我这样做:

cout << letra << endl;

我明白了:

méxico

发生了什么?我尝试过使用

setlocale(LC_ALL,es_MX.UTF-8);
setlocale(LC_ALL,"");

虽然该函数没有返回&#34; NULL&#34;但它不起作用。我在Linux上使用Codeblocks 16.01,gcc 4.9,g ++ 4.9。

1 个答案:

答案 0 :(得分:0)

std::string无法识别编码;其operator[]返回其各个字节,而不是单个字符。

在Unicode上,é实际上由两个字节组成,而letra[i]则分别得到每个字节。但是,operator<<的{​​{1}}通过&#34;撰写&#34;做了正确的工作。这两个字节并实际打印字符std::string

要分别访问每个字符(不是随机访问),您可以使用é中定义的mbtowc

<cstdlib>

它检查int mbtowc(wchar_t* pwc, const char* s, size_t n); n个字节以查找字符并将其放在s,返回读取的字节数。你的打印程序就像这样:

pwc