我有以下代码:
#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。
答案 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