C ++文字和Unicode

时间:2017-02-20 21:01:28

标签: c++ string literals

C ++ Literals

环境:

  • 操作系统:Windows 10 Pro;
  • 编译:GCC最新。
  • IDE:Code :: Blocks latest。
  • 致力于:控制台应用程序。

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

Qs的:

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! (纯)

     

Hello World! (U8)

     

0x47f0580x47f0840x47f0d8

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

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

问题4:另外,我将逐步介绍自定义类型文字。

2 个答案:

答案 0 :(得分:3)

首先看:http://en.cppreference.com/w/cpp/language/string_literal

std::cout的类操作符<<已正确重载以打印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的课程对<<const char16_t*const char32_t*没有特殊const wchar_t*重载,因此它会匹配{{1}打印指针的重载,这就是原因:

<<

打印:

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

如您所见,实际上有3个指针值:0x47f0580x47f0840x47f0d8 0x47f0580x47f084

但是,对于最后一个,您可以使用0x47f0d8

正确打印
std::wcout

打印

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

1:由于UTF-8的前几个代码点的直接ASCII mapping Hello World! (plain) 字面值按预期打印。

答案 1 :(得分:1)

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将它们输出到控制台,或将它们转换为单字节字符类型。原始字符串文字对于格式化输出非常方便。 Raw字符串文字的示例是R"~(This is the text that will be output just as I typed it into the code editor!)~",它将是单字节字符串。如果它的前缀是任何多字节限定符,则原始字符串文字将是多字节的。 Here是关于字符串文字的非常全面的参考。