Unicode

無需任何命令即可將純文字文件從 ASCII 轉換為 Unicode

  • May 24, 2016

為什麼 ASCII 編碼文件擴展為 UTF-8 或反向縮減為 ASCII?

user:~$ echo 'A  B  C  |  }  ~' > ./file 
user:~$ 
user:~$ file --brief --mime ./file
text/plain; charset=us-ascii
user:~$ 
user:~$ 
user:~$ echo 'ᴁ  ♫  ⼌  𝐑  🀵  🈀' >> ./file 
user:~$ 
user:~$ file --brief --mime ./file 
text/plain; charset=utf-8
user:~$
user:~$  
user:~$ cat ./file 
A  B  C  |  }  ~
ᴁ  ♫  ⼌  𝐑  🀵  🈀
user:~$ 
user:~$ 
user:~$ sed -i '$d' ./file 
user:~$ 
user:~$ cat ./file 
A  B  C  |  }  ~
user:~$
user:~$ file --brief --mime ./file 
text/plain; charset=us-ascii
user:~$

萬一您無法讀取第二個echo語句中的字元:從第一個到最後一個:U+1D01,ᴁ;U+266B, ♫; U+2F0C, ⼌; U+1D411,𝐑;U+1F035, 🀵; U+1F200,🈀。

區域設置為:

user:~$ echo $LANG
en_US.UTF-8
user:~$ echo $LANGUAGE
en_US:en
user:~$ echo $LC_COLLATE

user:~$ echo $LC_CTYPE

user:~$ echo $SHELL
/bin/bash
user:~$ echo $SHELL
/bin/bash
user:~$ 
user:~$ ps -p $$
 PID TTY          TIME CMD
7537 pts/6    00:00:00 bash
user:~$ 

我認為您混淆了“編碼”和“字元集”。

在第一種情況下,該文件僅包含在 US-ASCII 中找到的字元。這意味著無論您使用什麼語言設置來顯示文件,文件看起來都一樣。

在第二種情況下,該文件現在包含屬於 UTF8 字元集的字元,因為這就是您放入其中的內容。

這裡沒有發生轉換;該命令只是告訴您文件的內容是什麼。

file命令只是猜測您要分析的文件中的內容。它通過從文件頭讀取一定數量的字節來進行分析,有時是在一個多步驟過程中(如果它在開頭找到一些清晰的標記)。在非結構化文本文件中,它讀取的字元數肯定會多於您的擴展字元數./file,因此它會分析所有字元。

在您的第二個範例中,您將一些 utf-8 字元放入一個文件中,並在此基礎上使用字元集file結束該文件。utf-8如果您有例如只有 ASCII 字元的 900Kb 文件並附加您的“utf-8”回顯​​行,file仍會將其報告為 ascii 編碼文件,因為它沒有讀取到 utf-8 編碼字元。

門檻值接近 100Kb

引用自:https://unix.stackexchange.com/questions/160001