C++文字和统一码

C++ Literals and Unicode

本文关键字:一码 文字 C++      更新时间:2023-10-16

C++ 文字

环境:

  • 操作系统: 视窗 10 专业版;
  • 编译器:GCC 最新。
  • IDE:代码::块最新。
  • 正在处理:控制台应用程序。

我对数字文字前缀的理解是,它们对于确定数值类型(不确定)很有用。但是,我对字符和字符串文字前缀和后缀有很多困惑。我读了很多书,花了几天时间试图了解情况,但我得到的问题更多,答案很少。所以我认为堆栈溢出可能会有很大帮助。

问:

1- 字符串前缀 u8 u u L 的正确用法是什么?

我有以下代码作为示例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "nn Hello World! (plain) n";
cout << u8"n Hello World! (u8) n";
cout << u"n Hello World! (u) n";
cout << U"n Hello World! (U) n";
cout << L"n Hello World! (plain) nn";
cout << "nnn";
}

输出如下所示:

世界您好!(平原)

世界您好!(U8)

0x47f0580x47f0840x47f0d8

Q2:为什么U u ans L有这样的输出?我希望它只是确定类型而不是进行编码映射(如果是的话)。

Q3 有没有关于 UTF-8 等编码的简单而中肯的参考。我对它们感到困惑,此外,我怀疑控制台应用程序是否能够处理它们。我认为理解它们至关重要。

Q4:此外,我将感谢解释自定义类型文字的分步参考。

第一次看到:http://en.cppreference.com/w/cpp/language/string_literal

std::cout的类运算符<<被正确重载以打印const char*。这就是打印前两个字符串的原因。

cout << "nn Hello World! (plain) n";
cout << u8"n Hello World! (u8) n";

正如预期的那样,打印1

Hello World! (plain)
Hello World! (u8)

同时std::cout的类对const char16_t*const char32_t*const wchar_t*没有特殊的<<重载,因此它将匹配<<打印指针的重载,这就是为什么:

cout << u"n Hello World! (u) n";
cout << U"n Hello World! (U) n";
cout << L"n Hello World! (plain) nn";

打印:

0x47f0580x47f0840x47f0d8

如您所见,那里实际上打印了 3 个指针值:0x47f0580x47f0840x47f0d8


但是,对于最后一个,您可以使用std::wcout使其正确打印

std::wcout << L"n Hello World! (plain) nn";

打印

Hello World! (plain)

1:由于 UTF-8 的前几个代码点的直接 ASCII 映射,按预期打印的u8文本。

1) 窄多字节字符串文字。不带前缀的字符串文本的类型为const char[]

2) 宽字符串文字。L"..."字符串文本的类型为const wchar_t[]

3) UTF-8 编码字符串文字。u8"..."字符串文本的类型为const char[]

4) UTF-16 编码字符串文字。u"..."字符串文本的类型为const char16_t[]

5) UTF-32 编码字符串文字。U"..."字符串文本的类型为const char32_t[]

6) 原始字符串文字。用于避免任何字符的转义,分隔符之间的任何内容都将成为字符串的一部分。前缀(如果存在)与上述含义相同。

std::cout需要单字节字符,否则可以输出0x47f0580x47f0840x47f0d8等值。如果您尝试输出由多字节字符(char16_t、char32_t 或 wchar_t)组成的文本,则需要使用std::wcout将它们输出到控制台,或将它们转换为单字节字符类型。原始字符串文字对于格式化输出非常方便。R"~(This is the text that will be output just as I typed it into the code editor!)~"Raw 字符串文本的一个示例,它将是单字节字符串。如果它以任何多字节限定符为前缀,则原始字符串文本将是多字节的。这是关于字符串文字的非常全面的参考。