2015-06-24 23 views
0

我想寫入文件中存在的每個字符。我猜unicode擁有最完整的角色集,但我不太清楚。你能幫我解決這個問題嗎?我正在使用C++。這段代碼似乎「只」寫了一組ASCII字符(或者我錯了嗎?)。 Thx尋求幫助。將每個可能的字符寫入文件

#include <iostream> 
#include <fstream> 

using namespace std; 

int main(void) { 

wofstream wOutStream; 
wOutStream.open("myFile.txt"); 

wchar_t myChar = 0; 
do { 
    wOutStream << myChar << " "; 
    myChar++; 
} while (myChar != 0); 

wOutStream.close(); 

cin.get(); 
return 0; 
} 
+1

你不能只是增加字符,並希望它成功遍歷整個UNICODE字符空間。字面上有幾十億個可能的字符,但[只有一小部分被分配](https://en.wikipedia.org/wiki/List_of_Unicode_characters)。 – tadman

+0

Unicode字符需要遵循某些位模式,因爲只提及了所有可能的數字中的一小部分。 –

+0

好的,但是您能否向我解釋一下如何做到這一點? –

回答

0

這是一個相當開放的問題,確切的答案取決於你有多雄心。所以我不打算髮佈一個計劃,但只列出了基本步驟:

  • 的Unicode字符分配到數字(所謂的碼點),比如「A」被分配到NR 65,一般用U + 0041以十六進制編寫。它還定義了名稱和許多其他屬性。比如「A」被稱爲「大寫拉丁字母A」,這是小寫的版本是「一」,這是一個左到右語言等

  • 的一部分,但它自己確實指定如何將該字符寫入文件。爲此你必須選擇一種編碼。一個常見的編碼是UTF-8,應該很容易找到將代碼點編碼爲字節的代碼。如果你打開你的文本文件,那麼你的編輯器也需要理解編碼(不應該是UTF-8的問題)。

  • 專門針對C++編寫UTF-8時,我會打開一個窄輸出流(std::ofstream)並寫入字節。原則上C++不支持編寫Unicode文件。你的程序大致看起來像這樣。

    for (unsigned int codePoint = 0; codePoint < 0x110000; ++codePoint) 
    { 
        std::string utf8 = encode_utf8(codePoint); 
        outStream << utf8 << " "; 
    } 
    

    也許每256個字符左右添加一個換行符。

  • 有2^16個碼點的17 飛機。許多常用字符都在第一架飛機上。您可以只打印第一個平面(U + 0000到U + FFFF),或者打印所有的碼點(U + 0000到U + 10FFFF)。有些飛機還沒有分配角色。

  • 是否要打印已分配碼點?在這種情況下,你必須從Unicode協會下載清單並解析它。沒有公式可以產生分配的代碼點。或者像其他人指出的那樣,您可以使用內置這些表的語言,如Python或Java。

  • 最後,一些範圍保留爲私人使用。你也可以選擇跳過這些。

+0

非常感謝!看起來像C++對於這項任務來說是一個糟糕的選擇?未分配的代碼點會是什麼樣子?如果它是一個空字符串,我可以在寫入文件之前檢查它。當我嘗試訪問該範圍內的某些內容以供私人使用時會發生什麼? –

+0

對Unicode進行一些研究可能是一個好主意。 C++是好的,但它會更加努力。未分配的代碼點和私人使用字符可能會顯示爲無效字符,具體取決於您如何顯示文件。例如,在私人使用區塊中,͸未分配。 – roeland

相關問題