gpt4 book ai didi

c++ - 为什么C++中的 `const char *`类型可以存储Unicode?

转载 作者:行者123 更新时间:2023-12-02 03:26:02 29 4
gpt4 key购买 nike

我可以编写这样的代码:

const char * a = "你好";
cout<<a;

但是当这样写时:

char a[] = {'你','好'};
cout<<a;

输出乱码如下:

enter image description here

我以为汉字存储在wchar_t中,

那么const char *怎么包含汉字呢?

最佳答案

当您编写 char a[] = {'你','好'}; 时,它声明了一个包含 2 个元素(即 2 个字符)的 char 数组。由于它不是以 null 结尾的,因此它不是 cout 可以正确打印的字符串,并且尝试打印它会调用未定义的行为。但即使你添加一个空终止符 { '你', '好', '\0' }; 它仍然不起作用,因为 1 字节的 char 可以不存储汉字。事实上,如果两个单引号之间的内容超过 1 个字节(如本例中的 'abcd''你'),则行为是执行-定义。请参阅Multicharacter literal in C and C++

但是,如果将字符括在双引号内“你好”,那么它绝对不是 3 字节空终止字符串文字,而是字节序列在一些encoding 。 C++ 标准没有指定在字符串文字中使用哪种编码,但它通常是在其编码中保存在源文件中的任何字节,通常是 Windows 中当前的 ANSI 代码页, Linux 中的 UTF-8。 std::string 将一个 const char* 包装在里面,所以同样的事情也适用于它

UTF-8 是 variable-length encoding其单位与其他一样都是字节 multi-byte encodings ,因此其底层表示可以是一个 char[] 数组,而 "你好" 将是一个由 6 个代码单元组成的字符串。您可以使用 strlen() 进行检查。 OTOH cout 对这些字符一无所知,并且不关心这些字符是否是单字节字符或更长。它只是将字节流传递到终端,终端的工作是将它们显示在屏幕上。但如果它愿意,它可以轻松确定字符的长度,就像终端或文本编辑器所做的那样,因为它是在字符编码中定义的

<小时/>

C++ 中还有许多其他字符类型: wchar_t, char8_t, char16_t and char32_t 。它们对应的字符串类型为 std::wstring, std::u8string, std::u16string and std::u32string

就像 char* 一样,wchar_t* 中的编码未由标准定义,但通常 Windows 中为 UTF-16,Linux 中为 UTF-32。建议使用 char8_tchar16_tchar32_t,它们强制使用 UTF-8/16/32 编码,而不管编译器设置如何 em> 和源文件编码

要在任何编码之间进行转换,您可以使用 std::codecvt .
还有已弃用的转换器 std::wstring_convert/std::codecvt_utf8/std::codecvt_utf16/std::codecvt_utf8_utf16在较旧的 C++ 标准和每个系统中的转换例程中:iconv在 Unix 和 WideCharToMultiByte/MultiByteToWideChar在 Windows 中,但最好使用现代标准函数以实现可移植性

您可能想阅读这些内容

关于c++ - 为什么C++中的 `const char *`类型可以存储Unicode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60718822/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com