Programing

스크립트를 통해 Unix에서 파일 인코딩을 찾는 방법

lottogame 2020. 3. 26. 08:19
반응형

스크립트를 통해 Unix에서 파일 인코딩을 찾는 방법


디렉토리에있는 모든 파일의 인코딩을 찾아야합니다. 사용 된 인코딩을 찾는 방법이 있습니까?

file명령은이 작업을 수행 할 수 없습니다.

관심있는 인코딩은 ISO-8859-1입니다. 인코딩이 다른 것이라면 파일을 다른 디렉토리로 옮기고 싶습니다.


찾고있는 것 같습니다 enca. 인코딩을 추측하고 변환 할 수도 있습니다. 그냥 보는 사람이 페이지 .

또는 실패하면 file -i(linux) 또는 file -I(osx)를 사용하십시오. 파일에 대한 MIME 유형 정보가 출력되며 문자 세트 인코딩도 포함됩니다. 나는 그것에 대한 맨 페이지도 발견 했다. :)


file -bi <file name>

많은 파일에 대해이 작업을 수행하려는 경우

for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done

uchardet -Mozilla에서 포팅 된 인코딩 검출기 라이브러리.

용법:

~> uchardet file.java 
UTF-8

다양한 Linux 배포판 (Debian / Ubuntu, OpenSuse-packman 등)은 바이너리를 제공합니다.


다음은 MacOsX에서 작동하는 파일 -I 및 iconv를 사용하는 예제 스크립트입니다. 질문에 대해서는 iconv 대신 mv를 사용해야합니다

#!/bin/bash
# 2016-02-08
# check encoding and convert files
for f in *.java
do
  encoding=`file -I $f | cut -f 2 -d";" | cut -f 2 -d=`
  case $encoding in
    iso-8859-1)
    iconv -f iso8859-1 -t utf-8 $f > $f.utf8
    mv $f.utf8 $f
    ;;
  esac
done

그것이 iso-8859-1인지 판단하기는 정말 어렵습니다. iso-8859-1 일 수 있지만 7 비트 문자 만있는 텍스트가있는 경우 알 수 없습니다. 8 비트 문자가 있으면 상위 영역 문자가 순서대로 인코딩됩니다. 따라서 사전을 사용하여 어떤 단어인지 더 잘 추측하고 거기에서 어떤 글자인지 결정해야합니다. 마지막으로 utf-8 일 가능성이 있음을 감지하면 iso-8859-1이 아닌지 확인하십시오.

아무 말도하지 않으면 알 수 없기 때문에 인코딩은 가장 어려운 작업 중 하나입니다.


Python에서는 chardet 모듈을 사용할 수 있습니다 : https://github.com/chardet/chardet


데비안에서는 다음을 사용할 수도 있습니다. encguess:

$ encguess test.txt
test.txt  US-ASCII

인코딩을 8859에서 ASCII로 변환하려면

iconv -f ISO_8859-1 -t ASCII filename.txt

이것은 당신이 완벽하게 할 수있는 일이 아닙니다. 하나의 가능성은 범위의 모든 문자가 포함되지 않도록 파일에 모든 문자를 조사하는 것 0x00 - 0x1f또는 0x7f -0x9f내가 말했듯이,이 ISO8859의 적어도 하나 개의 다른 변종을 포함하여 파일의 수에 대한 진실 일 수 있지만.

또 다른 가능성은 지원되는 모든 언어로 파일에서 특정 단어를 찾아서 찾을 수 있는지 확인하는 것입니다.

예를 들어 지원되는 모든 언어 8859-1에서 영어 "and", "but", "to", "of"등을 찾아서 파일.

나는 다음과 같은 리터럴 번역에 대해 이야기하지 않습니다.

English   French
-------   ------
of        de, du
and       et
the       le, la, les

가능하지만. 나는 대상 언어로 일반적인 단어에 대해 이야기하고 있습니다. (아이슬란드 어에는 "and"에 대한 단어가 없습니다. "fish"에 대한 단어를 사용해야 할 것입니다. 요점을 설명하는 모든 범죄를 의미합니다]).


XML 파일 (ISO-8859-1)에 대해 이야기하고 있다면, 그 안의 XML 선언은 인코딩을 지정합니다. <?xml version="1.0" encoding="ISO-8859-1" ?>
따라서 정규 표현식 (예 :)을 사용 perl하여 모든 파일에서 해당 사양을 확인할 수 있습니다 .
자세한 내용은 텍스트 파일 인코딩을 결정하는 방법을 참조하십시오 .


좀 더 일반적인 답변에 관심이 있다는 것을 알고 있지만 ASCII의 장점은 다른 인코딩에 일반적입니다. 다음은 표준 입력이 ASCII인지 확인하기위한 Python one-liner입니다. (이것은 Python 2에서 작동한다고 확신하지만 Python 3에서만 테스트했습니다.)

python -c 'from sys import exit,stdin;exit()if 128>max(c for l in open(stdin.fileno(),"b") for c in l) else exit("Not ASCII")' < myfile.txt

Cygwin에서는 다음과 같이 작동합니다.

find -type f -name "<FILENAME_GLOB>" | while read <VAR>; do (file -i "$<VAR>"); done

예:

find -type f -name "*.txt" | while read file; do (file -i "$file"); done

iconv가 지원하는 소스 인코딩에서 모든 것을 utf8로 변환하는 awk로 파이프하고 iconv 명령을 작성할 수 있습니다.

예:

find -type f -name "*.txt" | while read file; do (file -i "$file"); done | awk -F[:=] '{print "iconv -f "$3" -t utf8 \""$1"\" > \""$1"_utf8\""}' | bash

file 명령을 사용하여 단일 파일의 인코딩을 추출 할 수 있습니다. 다음과 같은 sample.html 파일이 있습니다.

$ file sample.html 

sample.html : 매우 긴 행이있는 HTML 문서, UTF-8 유니 코드 텍스트

$ file -b sample.html

매우 긴 행이있는 HTML 문서, UTF-8 유니 코드 텍스트

$ file -bi sample.html

텍스트 / html; 문자 집합 = UTF-8

$ file -bi sample.html  | awk -F'=' '{print $2 }'

utf-8


다음 스크립트를 사용하여

  1. FILTER와 SRC_ENCODING와 일치하는 모든 파일 찾기
  2. 그들의 백업을 만듭니다
  3. DST_ENCODING으로 변환
  4. (선택 사항) 백업 제거

.

#!/bin/bash -xe

SRC_ENCODING="iso-8859-1"
DST_ENCODING="utf-8"
FILTER="*.java"

echo "Find all files that match the encoding $SRC_ENCODING and filter $FILTER"
FOUND_FILES=$(find . -iname "$FILTER" -exec file -i {} \; | grep "$SRC_ENCODING" | grep -Eo '^.*\.java')

for FILE in $FOUND_FILES ; do
    ORIGINAL_FILE="$FILE.$SRC_ENCODING.bkp"
    echo "Backup original file to $ORIGINAL_FILE"
    mv "$FILE" "$ORIGINAL_FILE"

    echo "converting $FILE from $SRC_ENCODING to $DST_ENCODING"
    iconv -f "$SRC_ENCODING" -t "$DST_ENCODING" "$ORIGINAL_FILE" -o "$FILE"
done

echo "Deleting backups"
find . -iname "*.$SRC_ENCODING.bkp" -exec rm {} \;

PHP에서는 다음과 같이 확인할 수 있습니다.

인코딩 목록을 명시 적으로 지정 :

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"

보다 정확한 "mb_list_encodings":

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

여기 첫 번째 예에서 일치하는 인코딩 목록 (목록 순서 감지)을 넣었 음을 알 수 있습니다. 보다 정확한 결과를 얻으려면 다음을 통해 가능한 모든 인코딩을 사용할 수 있습니다. mb_list_encodings ()

mb_ * 함수에는 php-mbstring이 필요합니다

apt-get install php-mbstring

이 명령으로 :

for f in `find .`; do echo `file -i "$f"`; done

디렉토리 및 하위 디렉토리의 모든 파일과 해당 인코딩을 나열 할 수 있습니다.


Perl에서는 Encode :: Detect를 사용하십시오.

참고 URL : https://stackoverflow.com/questions/805418/how-to-find-encoding-of-a-file-in-unix-via-scripts

반응형