C++ 写入终端输出的UTF-8符号

C++ 写入终端输出的UTF-8符号,c++,utf-8,character-encoding,char,C++,Utf 8,Character Encoding,Char,我一直在试图理解操作符的工作原理,终端正在决定如何显示您输入的字节。您将在2字节UTF-8编码的Unicode字符的两个字节之间向它提供一个换行符(std::endl)。与此相反: std::cout << m0 << std::endl; // Prints � std::cout << m1 << std::endl; // Prints � std::cout终端正在确定如何显示正在向其输入的字节。您将在2字节UTF

我一直在试图理解
操作符的工作原理,终端正在决定如何显示您输入的字节。您将在2字节UTF-8编码的Unicode字符的两个字节之间向它提供一个换行符(
std::endl
)。与此相反:

std::cout << m0 << std::endl;       // Prints �
std::cout << m1 << std::endl;       // Prints �

std::cout终端正在确定如何显示正在向其输入的字节。您将在2字节UTF-8编码的Unicode字符的两个字节之间向它提供一个换行符(
std::endl
)。与此相反:

std::cout << m0 << std::endl;       // Prints �
std::cout << m1 << std::endl;       // Prints �

std::cout您正在处理两种不同的类型,
unsigned char[]
unsigned char
。 如果您在
t
上执行
sizeof
,您会发现它占用了 三个字节,并且
strlen(t)
将返回2。另一方面 另一方面,
m0
m1
是单个字符

当您输出
无符号字符[]
时,它将转换为
unsigned char*
,流输出所有字节,直到 它遇到一个
'\0'
(这是
t
中的第三个字节)。什么时候 输出一个
无符号字符
,流只输出该字符 字节。因此,在第一行中,输出设备接收 2字节,然后是行的结尾。在最后两项中,它收到 1字节,然后是行的结尾。这个字节,后跟 行尾不是合法的UTF-8字符,因此显示 设备显示了一些指示有错误的信息, 或者它不明白

使用UTF-8(或任何其他多字节编码)时,您可以 无法从字符串中提取单个字节并期望它们
有任何真正的意义。

您正在处理两种不同的类型,
无符号字符[]
无符号字符
。 如果您在
t
上执行
sizeof
,您会发现它占用了 三个字节,并且
strlen(t)
将返回2。另一方面 另一方面,
m0
m1
是单个字符

当您输出
无符号字符[]
时,它将转换为
unsigned char*
,流输出所有字节,直到 它遇到一个
'\0'
(这是
t
中的第三个字节)。什么时候 输出一个
无符号字符
,流只输出该字符 字节。因此,在第一行中,输出设备接收 2字节,然后是行的结尾。在最后两项中,它收到 1字节,然后是行的结尾。这个字节,后跟 行尾不是合法的UTF-8字符,因此显示 设备显示了一些指示有错误的信息, 或者它不明白

使用UTF-8(或任何其他多字节编码)时,您可以 无法从字符串中提取单个字节并期望它们
有任何实际意义。

您需要定义执行此代码的环境您需要定义执行此代码的环境
std::cout << m0 << m1 << std::endl; // Prints ي