2010-01-13 28 views
9

我從用戶那裏獲取控制檯輸入,並且想要將其編碼爲UTF-8。我的理解是C++沒有輸入流的標準編碼,而是取決於編譯器,運行時環境,本地化以及哪些不是。通過檢查輸入字節確定輸入編碼

如何通過檢查輸入的字節來確定輸入編碼?

回答

3

一般來說,你不能。如果我在應用程序中隨機生成的字節流,它如何確定其「編碼」?您只需指定您的應用程序接受某些編碼,或者假定操作系統提供的內容將被適當編碼。

+0

要在此基礎上構建,您可以使用環境來確定合理的默認值。看看$ LANG和locale命令,如果你的操作系統支持它們的話。 – 2010-01-13 14:46:17

2

通常檢查輸入是否爲UTF是一個啓發式問題 - 沒有明確的算法會說明你是/否。啓發式設計越複雜,您獲得的誤報/否定就越少,但沒有「確定」的方式。

對於啓發式的例子,你可以看看這個庫:http://utfcpp.sourceforge.net/

bool valid_utf8_file(iconst char* file_name) 
{ 
    ifstream ifs(file_name); 
    if (!ifs) 
     return false; // even better, throw here 

    istreambuf_iterator<char> it(ifs.rdbuf()); 
    istreambuf_iterator<char> eos; 

    return utf8::is_valid(it, eos); 
} 

您可以使用它,或檢查其來源,他們是怎麼做到的。

+0

注意 - 這告訴你它是否可以是utf8,你不知道它是否是。一個普通的7位ASCII碼流是utf8,直到你敲擊第一個重音字符。 – 2010-01-13 14:47:22

+1

*檢查*輸入是否有效UTF-8不是啓發式的(這是你的函數的作用),但確定UTF-8是否是用戶的*意圖*是。 – 2010-01-13 14:48:34

+0

語言快捷鍵:/ – 2010-01-13 15:16:30

0

使用內置的操作系統手段。這些因操作系統而異。在Windows上,使用WideChar API總是更好,並且根本不考慮編碼。

如果您的輸入來自文件,而不是真實的控制檯,則所有投注都將關閉。

0

Jared Oberhaus回答了這個問題,他專門針對java的related question

基本上有幾個步驟可以用來做出合理的猜測,但最終只是猜測而沒有明確的指示。 (因此,UTF-8文件中的(着名的)BOM標記)

0

正如已經對question John Weldon has pointed to所述的那樣,存在許多用於進行字符編碼識別的庫。您還可以查看unix file命令的 源,並查看它使用哪些測試來確定文件編碼。從file手冊頁:

ASCII,ISO-8859-X,非ISO 8位擴展ASCII字符集(如在Macintosh和IBM PC系統中使用),UTF-8編碼Unicode,UTF-16編碼的Unicode和EBCDIC字符集可以通過構成每個集合中可打印文本的不同範圍和字節序列來區分。

PCRE提供了一個函數來測試其完全是有效的UTF-8給定的字符串。