2011-10-24 71 views
2

應該如何讀取我不知道其編碼(ASCII或Unicode)的文本文件?在C++中讀取未知編碼的文本文件

是否有一些類自動檢測編碼?

+0

什麼是您使用文本編輯器聲明爲 一個HTML表格,但它似乎並沒有被顯示爲一個。 ? – Swiss

+0

使用C++類,而不是在文本編輯器中 –

+4

@angela:這是不可能做到可靠的。編碼告訴你如何解釋這些數據。計算機沒有簡單的方法來判斷某個解釋是否正確即使對於那些可能非常困難的人類也是如此)有些啓發式方法可以提供一些幫助,但它們並非100%可靠 –

回答

6

我只能在這裏給出否定的答案:沒有通用的方法來確定文件的編碼。 ASCII文件可以被讀爲ISO-8859-15編碼,因爲ASCII是一個子集。更糟糕的是,其他文件可能在兩種不同含義的編碼中有效。所以你需要通過其他方式獲得這些信息。在許多情況下,假設所有內容都是UTF8是一種很好的方法。如果您正在處理* NIX環境,LC_CTYPE變量可能會有所幫助。如果您不關心編碼(例如,您不更改或處理內容),則可以以二進制格式打開文件。

+0

在很多情況下,即使知道編碼,你甚至不能說出什麼語言(足夠短)的文本片段存在:) –

0

一個這樣做的方式(暴力)可以

  • 內置合適的編碼列表(僅限ISO-代碼頁和Unicode)
  • 遍歷所有考慮編碼
  • 編碼文本採用這種編碼
  • 編碼回爲Unicode
  • 比較錯誤的結果
  • 如果沒有錯誤,記恩所產生最少的字節編碼

參考:http://www.codeproject.com/KB/recipes/DetectEncoding.aspx

如果您確信您的來電編碼是ANSI或Unicode,那麼你還可以檢查byte order mark。但是,讓我告訴你,這不是完整的。

+0

雖然這可能在理論上回答這個問題,[最好](http://meta.stackexchange.com/q/8259)在這裏包含答案的基本部分,並提供參考鏈接。 –

+0

謝謝比爾。我已經編輯了相應的答案。 – krammer

1

這在一般情況下是不可能的。如果文件正好包含我在此處輸入的字節數 ,則它與ISO 8859變體的ASCII,UTF-8或任何 同等有效。幾個試探法可以用作猜測, 但是:讀取第一「頁」(512個字節左右),然後,在下面的 順序:

  1. 查看該塊與BOM中的一個開始Unicode 格式
  2. 查看前四個字節。如果它們包含`'\ 0'`,你可能 處理某種形式的UTF-16或UTF-32的,按照以下 模式: '\0', other, '\0', other utf16be應按 other, '\0', other, '\0' utf16le應按 '\0', '\0', '\0', other UTF32BE other, '\0', '\0', '\0' UTF32RLE
  3. 查找頂部位已設置的字節。如果它是合法的 UTF-8字符的開始,那麼該文件可能是UTF-8。否則...在 我工作過的地區,ISO 8859-1通常是最好的 猜測。
  4. 否則,你或多或少不得不假設ASCII,直到你遇到一個最高位被設置的字節(此時,你使用 以前的啓發式)。

但正如我所說,這不是100%確定。

(PS。我怎麼在這裏格式的表。在點2的文本