[英]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.