문제

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

그만큼 file 명령은 이것을 할 수 없습니다.

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

도움이 되었습니까?

해결책

찾고있는 것 같네요 enca. 인코딩 사이를 추측하고 전환 할 수도 있습니다. 그냥보세요 남자 페이지.

또는 실패, 사용 file -i (Linux) 또는 file -I (OSX). 이는 파일에 대한 MIME 형 정보를 출력하며 여기에는 문자 세트 인코딩도 포함됩니다. 나는 a를 찾았다 인간 페이지 그것을 위해, :)

다른 팁

file -bi <file name>

많은 파일을 위해 이것을하고 싶다면

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

UCHARDET - 모질라에서 포팅 된 인코딩 검출기 라이브러리.

용법:

~> uchardet file.java 
UTF-8

다양한 Linux 배포판 (Debian/Ubuntu, OpenSuse-Packman, ...)은 이항을 제공합니다.

다음은 MacOSX에서 작동하는 File -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

Debian에서는 다음을 사용할 수 있습니다. encguess:

$ encguess test.txt
test.txt  US-ASCII

이것은 당신이 완벽한 방식으로 할 수있는 일이 아닙니다. 한 가지 가능성은 파일의 모든 문자를 검사하여 범위에 문자가 포함되지 않도록하는 것입니다. 0x00 - 0x1f 또는 0x7f -0x9f 그러나 내가 말했듯이, 이것은 적어도 하나의 다른 ISO8859를 포함하여 여러 파일의 경우에 해당 될 수 있습니다.

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

예를 들어, 8859-1의 모든 지원되는 언어에서 영어 "및", ",", ","to "," "등의 동등한 것을 찾아서 파일.

나는 다음과 같은 문자적인 번역에 대해 말하는 것이 아닙니다.

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

가능하지만 가능합니다. 나는 대상 언어의 일반적인 단어에 대해 이야기하고 있습니다 (내가 아는 모든 것에 대해 아이슬란드 주의자는 "와" - " - 당신은 아마도"fish "에 그들의 단어를 사용해야 할 것입니다. 지점을 보여주는 범죄를 의미합니다.)).

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

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

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

나는 당신이 더 일반적인 대답에 관심이 있다는 것을 알고 있지만 ASCII에서 좋은 것은 일반적으로 다른 인코딩에서 좋습니다. 다음은 표준 입력이 ASCII인지 확인하기위한 파이썬 원 라이너입니다. (나는 이것이 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로 변환하기 위해 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

파일 명령으로 단일 파일의 인코딩을 추출 할 수 있습니다. 다음과 같은 Sample.html 파일이 있습니다.

$ file sample.html 

Sample.html : HTML 문서, UTF-8 유니 코드 텍스트, 매우 긴 줄이 있습니다.

$ file -b sample.html

HTML 문서, UTF-8 유니 코드 텍스트, 매우 긴 줄이 있습니다.

$ file -bi sample.html

텍스트/html; charset = UTF-8

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

UTF-8

다음 스크립트를 사용하고 있습니다

  1. 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 {} \;

Perl을 사용하면 Encode :: Detect를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top