【发布时间】:2016-08-20 12:40:31
【问题描述】:
我相信输出与 UTF 有关,但我不知道如何。 请有人解释一下吗?
#include <iostream>
#include <cstdint>
#include <iomanip>
#include <string>
int main()
{
std::cout << "sizeof(char) = " << sizeof(char) << std::endl;
std::cout << "sizeof(std::string::value_type) = " << sizeof(std::string::value_type) << std::endl;
std::string _s1 ("abcde");
std::cout << "s1 = " << _s1 << ", _s1.size() = " << _s1.size() << std::endl;
std::string _s2 ("abcdé");
std::cout << "s2 = " << _s2 << ", _s2.size() = " << _s2.size() << std::endl;
return 0;
}
输出是:
sizeof(char) = 1
sizeof(std::string::value_type) = 1
s1 = abcde, _s1.size() = 5
s2 = abcdé, _s2.size() = 6
g++ --version 打印 g++ (Ubuntu 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609
QTCreator 编译如下:
g++ -c -m32 -pipe -g -std=c++0x -Wall -W -fPIC -I../strsize -I. -I../../Qt/5.5/gcc/mkspecs/linux-g++-32 -o main.o ../strsize/main.cpp
g++ -m32 -Wl,-rpath,/home/rodrigo/Qt/5.5/gcc -o strsize main.o
非常感谢!
【问题讨论】:
-
尝试打印
sizeof('é'),看看你会得到什么。 -
感谢您的宝贵时间。我添加了这两行:
std::cout << "sizeof('é') = " << sizeof('é') << std::endl;std::cout << "sizeof(\"é\") = " << sizeof("é") << std::endl;输出为:sizeof('é') = 4sizeof("é") = 3 -
@canellas
sizeof('é')可能将char提升为int,这可以解释为什么它的大小是4。字符串文字"é"等同于const char[],所以@ 987654338@ 是 3,因为é在 UTF-8 (0xC3 0xA9) 中使用 2chars 编码,后跟空终止符。 -
感谢您的 cmets!我还是有点迷茫...
std::cout怎么知道abcdé的位置 5 e 6 中的字节必须在打印之前组合成两个字节的值? -
how can std::cout know that the bytes in position 5 e 6 of abcdé must be combined in a two byte value, before printing?:没有。它盲目地输出字符串的 6 个字节,与它们的内容无关。您的 console(即 term/bash 等)设置为 UTF-8 环境并显示适当的字形。见How to set up a clean UTF-8 environment in Linux。