回答
我只能在這裏給出否定的答案:沒有通用的方法來確定文件的編碼。 ASCII文件可以被讀爲ISO-8859-15編碼,因爲ASCII是一個子集。更糟糕的是,其他文件可能在兩種不同含義的編碼中有效。所以你需要通過其他方式獲得這些信息。在許多情況下,假設所有內容都是UTF8是一種很好的方法。如果您正在處理* NIX環境,LC_CTYPE變量可能會有所幫助。如果您不關心編碼(例如,您不更改或處理內容),則可以以二進制格式打開文件。
在很多情況下,即使知道編碼,你甚至不能說出什麼語言(足夠短)的文本片段存在:) –
一個這樣做的方式(暴力)可以
- 內置合適的編碼列表(僅限ISO-代碼頁和Unicode)
- 遍歷所有考慮編碼
- 編碼文本採用這種編碼
- 編碼回爲Unicode
- 比較錯誤的結果
- 如果沒有錯誤,記恩所產生最少的字節編碼
參考:http://www.codeproject.com/KB/recipes/DetectEncoding.aspx
如果您確信您的來電編碼是ANSI或Unicode,那麼你還可以檢查byte order mark。但是,讓我告訴你,這不是完整的。
雖然這可能在理論上回答這個問題,[最好](http://meta.stackexchange.com/q/8259)在這裏包含答案的基本部分,並提供參考鏈接。 –
謝謝比爾。我已經編輯了相應的答案。 – krammer
這在一般情況下是不可能的。如果文件正好包含我在此處輸入的字節數 ,則它與ISO 8859變體的ASCII,UTF-8或任何 同等有效。幾個試探法可以用作猜測, 但是:讀取第一「頁」(512個字節左右),然後,在下面的 順序:
- 查看該塊與BOM中的一個開始Unicode 格式
- 查看前四個字節。如果它們包含`'\ 0'`,你可能 處理某種形式的UTF-16或UTF-32的,按照以下 模式:
'\0', other, '\0', other
utf16be應按other, '\0', other, '\0'
utf16le應按'\0', '\0', '\0', other
UTF32BEother, '\0', '\0', '\0'
UTF32RLE - 查找頂部位已設置的字節。如果它是合法的 UTF-8字符的開始,那麼該文件可能是UTF-8。否則...在 我工作過的地區,ISO 8859-1通常是最好的 猜測。
- 否則,你或多或少不得不假設ASCII,直到你遇到一個最高位被設置的字節(此時,你使用 以前的啓發式)。
但正如我所說,這不是100%確定。
(PS。我怎麼在這裏格式的表。在點2的文本
- 1. 在Adobe AIR中讀取未知編碼的文本文件
- 2. 未知的文件編碼
- 3. 在未知目錄中讀取文件
- 4. C編程讀取文本文件
- 5. 如何編碼爲UTF文本文件與未知編碼jquery
- 6. 用C讀取UNIX編碼的文件#
- 7. 讀取編碼爲[ANSI]的C#文本文件
- 8. 在C++中讀取文本文件
- 9. 在Mathematica中讀取UTF-8編碼的文本文件
- 10. C++根據編碼讀取文本文件
- 11. 從C#中的文本文件讀取#
- 12. c中讀取的文本文件#
- 13. 從C中的文本文件讀取
- 14. 讀取C中的文本文件
- 15. 在Shift JIS cp392編碼中無法讀取文本文件
- 16. C++文件未讀取?
- 17. C#從讀取文本文件中讀取二進制文件
- 18. 在PyCharm中讀取UTF8編碼文件
- 19. 在C編程中讀取/寫入文本文件
- 20. 在C#中編程讀取PDF文件#
- 21. 如何從文本文件中讀取數據,如果文件位置在C#中是未知的?
- 22. 無法讀取Visual FoxPro DBF文件中的編碼文本
- 23. C - 從文件中讀取未知大小的矩陣
- 24. 將CSV文件讀取到未知大小的C++中
- 25. C編程讀取文件
- 26. 從C編程中的文本文件讀取
- 27. C - fscanf無法正確讀取文本文件中的編號
- 28. 從文本文件中讀取。 C++
- 29. 從文本文件中讀取objective-c
- 30. 從文件中讀取文本c
什麼是您使用文本編輯器聲明爲 一個HTML表格,但它似乎並沒有被顯示爲一個。 ? – Swiss
使用C++類,而不是在文本編輯器中 –
@angela:這是不可能做到可靠的。編碼告訴你如何解釋這些數據。計算機沒有簡單的方法來判斷某個解釋是否正確即使對於那些可能非常困難的人類也是如此)有些啓發式方法可以提供一些幫助,但它們並非100%可靠 –