C++文字和统一码
C++ Literals and Unicode
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 个指针值:0x47f058
、0x47f084
和0x47f0d8
但是,对于最后一个,您可以使用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 字符串文本的一个示例,它将是单字节字符串。如果它以任何多字节限定符为前缀,则原始字符串文本将是多字节的。这是关于字符串文字的非常全面的参考。
- 使用strcpy将char数组的元素复制到另一个数组
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在 c++ 中拥有一组结构的正确方法是什么?
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种便携式方法可以在 C/C++ 中生成 nop 操作码?
- C++文字和统一码
- 为什么在一种情况下,我会收到带有字符串文字的已弃用转换警告,而在另一种情况下却没有?
- 是否有一种方法可以将变量列表传递给#Define指令,并导致其通过文字值替换字符串值
- 设置数组一次索引很多?复合文字
- 有没有一种方法可以从GCC中获取字符串文字
- 有没有一种方法可以使用std::array与文字或初始值设定项列表进行比较,就像使用赋值一样
- Typedef是C++中的一个位字段/掩码
- 用C++中的一个数字和一个位掩码生成一个数字数组
- 在Blackberry 10 Cascades中,有一种方法可以使用图像掩码或alpha通道更改Blackberry C
- 非静态成员函数,为每个对象创建生成一份机器码副本
- 有效地将一组值"Hash"到缯码
- c++文字u8和BOM(字节顺序掩码)