簡體   English   中英

檢測 Windows 中的文件中的 Unicode 10

[英]Detecting Unicode in files in Windows 10

現在 Windows 10 記事本不需要 unicode 文件來獲得 BOM header,默認情況下它不編碼 Z0994EFF76440DBF39C。 這確實破壞了檢查 header 以確定文件中的 Unicode 的現有代碼。 我現在如何在 C++ 中判斷文件是否在 unicode 中? 資料來源: https://www.bleepingcomputer.com/news/microsoft/windows-10-notepad-is-getting-better-utf-8-encoding-support/

我們要確定Unicode的代碼:

int IsUnicode(const BYTE p2bytes[3])
{
        if( p2bytes[0]==0xEF && p2bytes[1]==0xBB p2bytes[2]==0xBF) 
            return 1; // UTF-8
        if( p2bytes[0]==0xFE && p2bytes[1]==0xFF)
            return 2;  // UTF-16 (BE)
        if( p2bytes[0]==0xFF && p2bytes[1]==0xFE) 
            return 3; // UTF-16 (LE)
            
        return 0;
}

既然這么疼,為什么沒有一個典型的function來確定編碼呢?

您應該使用 W3C 方法,它類似於:

  • 如果您知道編碼,請使用它

  • 如果有BOM,用它來確定編碼

  • 解碼為 UTF-8。 UTF-8 具有嚴格的字節順序規則(這是 UTF-8 的目的:能夠找到字符的第一個字節)。 因此,如果文件不是 UTF-8,很可能它會解碼失敗:在 ANSI (cp-1252) 上,重音字母后跟符號並不常見,而且每次你有這樣的序列時都不太可能。 Latin-1:您可能會得到控制字符(而不是符號),但也很少有控制字符 C1 僅在重音字母之后,並且總是 C1 在重音字符之后。

  • 如果解碼失敗(也許您可以只測試前 4096 個字節,或 127 以上的 10 個字節),請使用操作系統的標准 8 位編碼(可能是 Windows 上的 cp-1252)。

這種方法應該很好用。 它偏向於 UTF-8,但世界早就朝着這樣的方向發展。 確定哪個代碼頁要困難得多。

您可以在最后一步之前添加一個步驟。 如果有各種00字節,則可能是 UTF-16 或 UTF-32 格式。 Unicode 要求您知道哪種形式(例如來自側通道),否則文件應該有 BOM。 但是你可以根據文件中00的position猜出形式(UTF-16LE, UTF-16BE, UTF-32LE, UTF32-BE)(換行,還有一些ASCII字符被認為是常見的腳本,所以在很多地方都會用到)腳本,所以你應該有很多00 )。

現在 Windows 10 不需要 unicode 文件即可擁有 BOM header。

Windows 從來沒有這個要求。 每個程序都可以隨意讀取文本文件。

可能很有趣: 對於 UTF-8 來說,BOM 可能並不理想,因為它破壞了 ASCII 兼容性。

這確實破壞了檢查 header 以確定文件中的 Unicode 的現有代碼。

這是一種誤解。 其他代碼可能比 Windows 的記事本支持 Unicode 的時間更長。

我現在如何在 C++ 中判斷文件是否在 unicode 中?

通常,您會檢查是否存在 BOM,然后當然會使用該信息。

接下來,您可以嘗試使用所有可能的編碼讀取文件(開頭)。 拋出異常的顯然不合適。

從剩余的編碼中,您可以使用啟發式方法來確定編碼。

如果它仍然是錯誤的選擇,請給用戶一個手動更改編碼的選項。 這就是在許多編輯器中完成的方式,例如 Notepad++。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM