file 명령에 따라 파일을 utf-8로 변환합니다.

file 명령에 따라 파일을 utf-8로 변환합니다.

파일을 읽고 sqlldr을 사용하여 데이터를 데이터베이스에 업로드하는 업로드 프로세스가 있습니다. sqlldr에서 파일을 처리하는 동안 잘못된 숫자에 대한 문제가 있습니다. 파일이 UTF-16에 있다는 것을 확인한 다음 메모장++에서 UTF-8로 변환하면 제대로 작동하기 시작했습니다. 이제 아래와 같이 체계적으로 변환해보려고 합니다.

iconv -f UTF-16 -t UTF-8 file_name >output_file_name

파일의 인코딩이 다를 수 있으므로 변환하기 전에 파일의 인코딩을 찾아보고 해당 인코딩을 기준으로 변환하고 싶습니다. 예를 들어 file 명령을 사용하여 아래에서 UTF-16만 읽은 다음 -f 옵션과 함께 사용합니다.

bash-4.2$ file "/FILE_UPLOADS/Relationship (4).txt"
/FILE_UPLOADS/Relationship (4).txt: Little-endian UTF-16 Unicode text, with CRLF line terminators

어떻게 해야 하나요?

답변1

vimex일부 파일 인코딩을 자동으로 감지하고 UTF-8로 변환할 수 있으므로 다음 모드를 사용하여 파일 처리를 시도해 볼 수 있습니다 .

vim --clean -E -s -c 'argdo set fileencoding=utf-8 nobomb | update' -c q -- *.txt

update또한 이 프로세스 중에 수정된 파일만 다시 작성합니다 .

답변2

file -i파일의 MIME 인코딩을 반환하는 를 사용할 수 있습니다 .

그것은 다음과 같습니다:

iconv -f `file -i $file|grep -Po 'charset=\K.*'` -t UTF-8 $file > $file_converted

또 다른 접근 방식은 다음과 같은 보다 전문적인 도구를 사용하는 것입니다.
https://gitlab.freedesktop.org/uchardet/uchardet
그러면 명령이 더 간단해집니다.

iconv -f `uchardet $file` -t UTF-8 $file > $file_converted

하지만 설치해야합니다.

답변3

언제 file말해야 할까?리틀 엔디안 UTF-16 유니코드 텍스트또는--mime-encoding UTF-16LE, 이는 파일이 리틀 엔디안 순서임을 나타내는 BOM과 함께 파일이 UTF-16으로 인코딩됨을 의미합니다.

fileBOM이 없으면 UTF-16 텍스트 파일(리틀 또는 빅 엔디안)을 감지할 수 없습니다.

UTF-16 텍스트의 경우 처음 2바이트가 0xff, 0xfe(리틀 엔디안) 또는 0xfe 0xff(빅 엔디안)여야 하며 데이터의 처음 64KiB 중 나머지 부분이 텍스트처럼 보이는지 확인합니다(텍스트에서 원치 않는 UTF만 찾습니다). 파일 -16개의 인코딩된 ASCII 제어 문자).

To 는 iconv리틀 utf-16le엔디안 UTF-16을 나타냅니다.아니요BOM, utf-16은 빅 엔디안이든 리틀 엔디안이든 BOM이 있는 utf-16을 의미합니다.

file -b --mime-encoding따라서 출력을 다음 과 같이 사용하면~에서charset을 사용하면 iconv출력에 UTF-8로 인코딩된 BOM이 표시됩니다.

여기서는 다음과 같은 것을 원할 수 있습니다:

encoding=$(file -b --mime-encoding - < "$file") &&
  case $encoding in
    (utf-16[bl]e) iconv -f UTF-16 < "$file" -t UTF-8 > "$newfile";;
    (us-ascii | utf-8) ;; # already utf-8
    (*) printf >&2 '%s\n' "don't know what to do with a $encoding encoding"
  esac

CRLF와 같은 Microsoft 파일인 경우 . (적어도 현재 버전)을 dos2unix사용 하여 UTF-16을 감지하고 로케일의 문자 세트로 변환할 수 있어야 합니다( 출력에 관계없이 UTF-8이 되도록 하려면). locale 을 실행하세요) CRLF를 LF로 변경하고 Microsoft 파일의 다른 문제를 수정하세요.iconvdos2unixLC_ALL=C.UTF-8 dos2unix

관련 정보