[英]encoding of file shell script
如何在shell腳本中檢查文件編碼? 我需要知道文件是用utf-8還是iso-8859-1編碼的。
謝謝
我只是用
file -bi myfile.txt
確定特定文件的字符編碼。
一個具有外部依賴性的解決方案,但我懷疑file
現在在所有半現代發行版中都很常見。
編輯:
作為對Laurence Gonsalves評論的回應: b
是“簡短”(不包括文件名)的選項, i
是--mime
的簡寫等效,所以最便攜的方式(包括Mac OSX)則可能是:
file --mime myfile.txt
沒有辦法100%確定(除非你正在處理內部聲明其編碼的文件格式)。
大多數嘗試進行此區分的工具都會嘗試將文件解碼為utf-8(因為這是更嚴格的編碼),如果失敗,則回退到iso-8859-1。 您可以使用iconv
“手動”執行此操作,也可以使用file
:
$ file utf8.txt
utf8.txt: UTF-8 Unicode text
$ file latin1.txt
latin1.txt: ISO-8859 text
請注意,ASCII文件兼容UTF-8和ISO-8859-1。
$ file ascii.txt
ascii.txt: ASCII text
最后:沒有真正的方法來區分ISO-8859-1和ISO-8859-2,例如,除非你假設它是自然語言並使用統計方法。 這可能是文件說“ISO-8859”的原因。
您可以使用文件命令file --mime myfile.text
文件命令不是100%確定的。 簡單測試:
#!/bin/bash
echo "a" > /tmp/foo
for i in {1..1000000}
do
echo "asdas" >> /tmp/foo
done
echo "üöäÄÜÖß " >> /tmp/foo
file -b --mime-encoding /tmp/foo
這個輸出:
us-ascii
Ascii不懂德語變音符號。
文件是一堆字節(字節序列)。 如果不信任元數據(僅針對utf-16和utf-32,MIME,數據標題推薦使用BOM),則無法真正檢測到編碼。 字節序列可以解釋為utf-8或ISO-8859-1 / 2或任何您想要的。 如果存在iso-8850-1 / utf-8圖,那么它取決於某些序列。 您想要的是將整個文件內容編碼為所需的字符編碼。 如果失敗,則所需的編碼不具有該字節序列的映射。
在shell中可能使用python,perl或類似Laurence Gonsalves說iconv。 對於我在python中使用的文本文件:
f = codecs.open(path, encoding='utf-8', errors='strict')
def valid_string(str):
try:
str.decode('utf-8')
return True
except UnicodeDecodeError:
return False
你如何將文件作為文本文件。 你沒有。 您使用所需的字符編碼逐行編碼。 好的,您可以添加一點信任並檢查是否存在BOM(文件是utf編碼的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.