簡體   English   中英

程序如何在讀取文件之前確定編碼類型?

[英]How does a program figures out type of encoding before reading a file?

我是編程新手,並試圖了解編碼。 到目前為止,我對編碼的想法是每個字符對應一個代碼點,然后根據我們選擇的編碼類型將其轉換為二進制表示。

現在當一個程序試圖讀取這個文件時,它如何知道用於該文件的編碼類型? 程序是否默認使用一種編碼類型,例如。 UTF-8? 如果是這種情況,假設一個程序默認使用 ascii,那么它是否會錯誤地讀取 UTF-8 文件,因為存在不屬於 ascii 標准的字符? 或者它會以某種方式發現這不是 ascii 並相應地閱讀它? 如果有怎么辦?

我的第二個猜測是有關編碼的信息可能會嵌入到由程序計算出來的文件本身中。 如果是這樣,那是怎么發生的?

一般來說,沒有辦法識別文件的字符集

現在的程序和瀏覽器大多基於UTF-8。 有些編輯器甚至在文件的開頭寫了一個字節順序標記( 0xEF 0xBB 0xBF來標記格式)來記住編碼。 Unicode中有一些無效字符代碼,可以用來識別其他編碼:

首先,UTF-8 中的每個字符必須是0xxxxxxx形式,其中x是任意位。 有以下三個例外:

  • 字節10xxxxxx必須跟在字節110xxxxx
  • 兩個字節10xxxxxx必須跟在一個字節1110xxxx
  • 三個字節10xxxxxx必須跟在一個字節11110xxx

有關進一步的解釋,請參見此處的示例。

在網站上(即在 HTML 中),編碼是使用標簽單獨指定的,例如

<meta http-equiv="content-type" content="text/html;charset=UTF-8">

一般來說,沒有辦法知道編碼。 尤其是在過去,很多編碼看起來很相似(只是重音字符不同)。

對於許多互聯網協議,有一種方法可以傳達編碼,以便程序知道假定的編碼。 您可以通過 email、ftp、http 看到這一點。 同樣在數據庫中,現在應該指定編碼(可能還有語言,用於對字符串進行排序)。

但是對於普通的文本文件,這很難。 許多程序嘗試正確獲取換行符(換行符[unix] 與換行符以及回車符[ASCII],有時只是回車符[舊 Mac])[注意:換行符換行符是同一個字符]。

現在我們處於一個更加標准化的世界,因此編碼更容易。 我們經常有這樣的算法:

  • 檢查第一個字節,如果您看到正確的 BOF(啟動文件的 3 種不同方式),您會將其解釋為 UTF-8、UTF-16LE 或 UTF-16BE。

  • 在非 Windows 機器上(或在 Windows 上,但對於 web 文件):

    • 假設它是 UTF-8。 如果沒問題,應該是 UTF-8 (也許只是嘗試第一個字符塊 [例如 4096])。 UTF-8 具有非常嚴格的字符序列(和禁止字符),因此非 UTF-8 文件通常應該無法通過 UTF-8 測試。 注意:ASCII 是 UTF-8 的子集,所以此時您將正確解碼 ASCII 文件

    • 否則假設其他 Windows 代碼頁上的 Latin-1 或“Windows ANSI”編碼(例如,來自您的系統:可能編寫文件的人來自您的相同語言)。 Latin-1 是“Windows ANSI”(以及其他 windows 代碼頁)的子集,大多數字符應該沒問題。

  • 在 Windows 機器上: go 到上述點 [UTF-8,帶回退] 如果您的字段/利基/設置通常可以預期 UTF-8

    • 否則:假設 Latin-1 或合適的“Windows ANSI”編碼。 Windows 嘗試將 BOM 添加到 UTF-8
  • 在任何情況下,都應該允許用戶指定編碼(例如,以防上述算法失敗)。

對於亞洲語言,還有其他算法,通常檢查頻繁字節和字節組。

注意:還有一些庫可以幫助檢測語言,但可以肯定的是,您已經看到程序和瀏覽器無法檢測到正確的編碼。 這是不可避免的。

現在 Unicode 正在成為標准方式,並且“Windows ANSI”取代了大部分拉丁腳本的編碼,因此任務很容易,但如果您需要轉換舊文件。

暫無
暫無

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

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