2017-02-20 50 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是一個非常全面的字符串文字參考。