C++ 文字和 Unicode
C++ Literals and Unicode
C++ 文字
环境:
- OS: Windows 10 临;
- 编译器:GCC 最新。
- IDE: Code::Blocks 最新。
- 致力于:控制台应用程序。
我对数字字面量前缀的理解是它们有助于确定数值类型(不确定)。但是,我对字符和字符串字面量前缀和后缀有很多困惑。我读了很多书,花了几天时间试图了解情况,但我得到的问题更多,答案却很少。所以我认为堆栈溢出可能会有很大帮助。
问题:
1- 字符串前缀 u8 u U L 的正确用法是什么?
我有以下代码作为示例:
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "\n\n 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) \n\n";
cout << "\n\n\n";
}
输出是这样的:
Hello World! (plain)
Hello World! (u8)
0x47f0580x47f0840x47f0d8
Q2:为什么U u ans L会有这样的输出?我预计它只是确定类型而不是进行编码映射(如果是)。
Q3 是否有关于 UTF-8 等编码的简单而中肯的参考资料。我对它们感到困惑,此外我怀疑控制台应用程序是否能够处理它们。我认为了解它们至关重要。
问题 4:另外,我将欣赏解释自定义类型文字的分步参考。
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
这样的值。如果您尝试输出由 multi-byte 个字符(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!)~"
并且将是一个单字节字符串。如果它以任何 multi-byte 限定符为前缀,原始字符串文字将为 multi-byte。 Here 是关于字符串文字的非常全面的参考。
初见:http://en.cppreference.com/w/cpp/language/string_literal
std::cout
的 class 运算符 <<
已正确重载以打印 const char*
。这就是打印前两个字符串的原因。
cout << "\n\n Hello World! (plain) \n";
cout << u8"\n Hello World! (u8) \n";
正如预期的那样,打印出1:
Hello World! (plain)
Hello World! (u8)
同时 std::cout
的 class 没有针对 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) \n\n";
打印:
0x47f0580x47f0840x47f0d8
如您所见,实际上打印了 3 个指针值:0x47f058
、0x47f084
和 0x47f0d8
但是,对于最后一个,您可以使用 std::wcout
使其正确打印
std::wcout << L"\n Hello World! (plain) \n\n";
打印
Hello World! (plain)
1: 由于 UTF-8 的前几个代码点的直接 ASCII mapping,按预期打印的 u8
文字。
C++ 文字
环境:
- OS: Windows 10 临;
- 编译器:GCC 最新。
- IDE: Code::Blocks 最新。
- 致力于:控制台应用程序。
我对数字字面量前缀的理解是它们有助于确定数值类型(不确定)。但是,我对字符和字符串字面量前缀和后缀有很多困惑。我读了很多书,花了几天时间试图了解情况,但我得到的问题更多,答案却很少。所以我认为堆栈溢出可能会有很大帮助。
问题:
1- 字符串前缀 u8 u U L 的正确用法是什么?
我有以下代码作为示例:
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "\n\n 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) \n\n";
cout << "\n\n\n";
}
输出是这样的:
Hello World! (plain)
Hello World! (u8)
0x47f0580x47f0840x47f0d8
Q2:为什么U u ans L会有这样的输出?我预计它只是确定类型而不是进行编码映射(如果是)。
Q3 是否有关于 UTF-8 等编码的简单而中肯的参考资料。我对它们感到困惑,此外我怀疑控制台应用程序是否能够处理它们。我认为了解它们至关重要。
问题 4:另外,我将欣赏解释自定义类型文字的分步参考。
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
这样的值。如果您尝试输出由 multi-byte 个字符(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!)~"
并且将是一个单字节字符串。如果它以任何 multi-byte 限定符为前缀,原始字符串文字将为 multi-byte。 Here 是关于字符串文字的非常全面的参考。
初见:http://en.cppreference.com/w/cpp/language/string_literal
std::cout
的 class 运算符 <<
已正确重载以打印 const char*
。这就是打印前两个字符串的原因。
cout << "\n\n Hello World! (plain) \n"; cout << u8"\n Hello World! (u8) \n";
正如预期的那样,打印出1:
Hello World! (plain) Hello World! (u8)
同时 std::cout
的 class 没有针对 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) \n\n";
打印:
0x47f0580x47f0840x47f0d8
如您所见,实际上打印了 3 个指针值:0x47f058
、0x47f084
和 0x47f0d8
但是,对于最后一个,您可以使用 std::wcout
std::wcout << L"\n Hello World! (plain) \n\n";
打印
Hello World! (plain)
1: 由于 UTF-8 的前几个代码点的直接 ASCII mapping,按预期打印的 u8
文字。