2017-02-20 55 views
1

C++字面C++字面和Unicode

环境:

  • 操作系统:Windows 10临;
  • 编译器: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这样的编码。我对它们感到困惑,另外我怀疑控制台应用程序是否有能力处理它们。我认为了解它们是至关重要的。

Q4:另外,我将欣赏一步一步的参考,解释自定义类型文字。

+0

*“Compiler:GCC latest。”* - 请给出版本号。完全有可能在你发表这篇文章和我的评论之间,新版本可能已经发布。另请查看http://en.cppreference.com/w/cpp/language/string_literal – WhiZTiM

+0

一般最好每个问题提出一个问题。多个问题倾向于庞大的答案,并且使未来的用户难以找到他们正在寻找的信息。 – user4581301

+0

例如,回答1需要对字符编码进行简短的讨论,为什么'std :: cout'似乎处理UTF8,而'std :: wcout'则会成为一个出色的独立问题。 – user4581301

回答

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"; 

正如预期的那样,版画:

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) \n\n"; 

打印:

0x47f0580x47f0840x47f0d8 

正如你可以看到,其实有印有3个指针值:0x47f0580x47f0840x47f0d8


然而,在过去的一个,你可以得到它使用std::wcout

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

打印

Hello World! (plain) 

1正常打印:由于UTF-8的前几个代码点的直接ASCII mapping,因此按预期打印的字符数u8

+0

值得指出的是,由于utf8的前几位被映射为ascii,所以u8打印出来。更复杂的字符串将填充垃圾 – user4581301

+0

@ user4581301,好点。编辑。谢谢! – WhiZTiM

+0

@ user4581301更复杂的字符串将在一个理智的操作系统(又名Windows)上正确打印。 cout并不关心,它是必须解释程序发送的多字节输出的控制台驱动程序。 – Cubbi

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