파일을 읽고 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
vim
ex
일부 파일 인코딩을 자동으로 감지하고 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으로 인코딩됨을 의미합니다.
file
BOM이 없으면 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 파일의 다른 문제를 수정하세요.iconv
dos2unix
LC_ALL=C.UTF-8 dos2unix