簡體   English   中英

編碼文件shell腳本

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

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