헤드와 메모장이 UTF-8로 읽을 수있는 바이너리 인코딩 변환

이진 문자 집합에있는 CSV 파일이 있지만 UTF-로 변환해야합니다. 8 HDFS (Hadoop)에서 처리합니다.

문자 집합을 확인하기 위해 아래 명령을 사용했습니다.

file -bi filename.csv 

출력 :

application/octet-stream; charset=binary 

파일을 바이너리에서 UTF-8로 변환하려고하면 오류가 발생합니다.

iconv -f binary -t utf-8 fiename.csv iconv: conversion from binary" is not supported Try iconv --help" or iconv --usage" for more information. 

누구나 변환 가능 여부를 이해하도록 도와 주시겠습니까? head 명령을 사용하여 데이터를 볼 수 있습니다.

무슨 의미, 바이너리는 읽을 수 없다는 것을 의미하지만 어떻게 head 명령 또는 메모장 은 데이터를 읽을 수 있습니다.

od -tc < 파일 이름 .csv | head

0000000 357 273 277 | | R e q u e s t _ I D # 0000020 D # T y p e # D # S u b m i t t 0000040 e r # D # S h o r t _ D e s c r 0000060 i p t i o n # D # L o g _ T e x 0000100 t # D # S t a t u s # D # A s s 0000120 i g n e d _ T o # D # A s s i g 0000140 n e e # D # C r e a t e _ D a t 0000160 e # D # F o r w T o E x t H D # 0000200 D # L a s t _ M o d i f i e d _ 0000220 B y # D # L o g _ I D # D # L o 

댓글

  • 질문에 od -tc < yourfile.csv | head의 출력을 추가 하시겠습니까?
  • file -bi는 바이너리 문자를 표시합니다. Vi에서 확인할 때 문자 인코딩은 utf-8을 표시합니다.
  • li>

  • od 출력은 BOM이있는 UTF-8 파일을 보여줍니다. file가 바이너리를보고하려면 첫 번째 섹션을 지나서 텍스트가 아닌 문자 (최소한 하나의 NUL 바이트 뒤에 NUL이 아닌 바이트)가 있어야합니다.
  • 파일 -bi가 utf-8로 표시된 후 " NUL "을 모두 제거했습니다. " NUL "는 문제가되지 않습니다.

답변

“binary “는 인코딩 (문자 세트 이름 ). iconv 작업을 수행하려면 인코딩 이름이 필요합니다.

file 유틸리티는 파일 형식을 인식하지 못하는 경우 유용한 정보를 제공하지 않습니다. 예를 들어 바이트 인코딩 마크 (BOM)없이 UTF-16 일 수 있습니다. notepad는이를 읽습니다. 동일한 내용이 UTF-8 (및 head는 터미널이 설정 될 수 있으므로 를 표시합니다. o UTF-8 인코딩이며 BOM은 상관 없습니다).

파일이 UTF-16이면 터미널은 head를 사용하여이를 표시합니다. 대부분의 문자는 ASCII (또는 심지어 Latin-1)이므로 UTF-16 문자의 “기타”바이트는 null이됩니다.

두 경우 모두 BOM이 부족합니다 ( file의 버전)을 혼동합니다. 그러나 이러한 파일 형식은 Windows에서 실행될 수있는 휴대용 응용 프로그램뿐만 아니라 Microsoft Windows에서도 사용할 수 있기 때문에 다른 프로그램이 작동 할 수 있습니다.

파일을 UTF-8로 변환하려면 어떤 인코딩인지 알아야합니다. 사용하고 해당 인코딩의 이름은 iconv입니다. 이미 UTF-8 인 경우 BOM 추가 여부 (처음에)는 선택 사항입니다. UTF-16에는 첫 번째 바이트에 따라 두 가지 유형이 있습니다. 또는 UTF-32를 조차 가질 수 있습니다. iconv -l는 다음을 나열합니다.

ISO-10646/UTF-8/ ISO-10646/UTF8/ UTF-7// UTF-8// UTF-16// UTF-16BE// UTF-16LE// UTF-32// UTF-32BE// UTF-32LE// UTF7// UTF8// UTF16// UTF16BE// UTF16LE// UTF32// UTF32BE// UTF32LE// 

“LE”및 “BE”는 리틀 엔드와 빅 엔드를 나타냅니다. 바이트 순서. Windows는 “LE”플레이버를 사용하고 iconv는 “LE”또는 “BE”가없는 플레이버를 가정 할 가능성이 높습니다.

8 진수를 사용하여이를 확인할 수 있습니다. (원문) 덤프 :

$ od -bc big-end 0000000 000 124 000 150 000 165 000 040 000 101 000 165 000 147 000 040 \0 T \0 h \0 u \0 \0 A \0 u \0 g \0 0000020 000 061 000 070 000 040 000 060 000 065 000 072 000 060 000 061 \0 1 \0 8 \0 \0 0 \0 5 \0 : \0 0 \0 1 0000040 000 072 000 065 000 067 000 040 000 105 000 104 000 124 000 040 \0 : \0 5 \0 7 \0 \0 E \0 D \0 T \0 0000060 000 062 000 060 000 061 000 066 000 012 \0 2 \0 0 \0 1 \0 6 \0 \n 0000072 $ od -bc little-end 0000000 124 000 150 000 165 000 040 000 101 000 165 000 147 000 040 000 T \0 h \0 u \0 \0 A \0 u \0 g \0 \0 0000020 061 000 070 000 040 000 060 000 065 000 072 000 060 000 061 000 1 \0 8 \0 \0 0 \0 5 \0 : \0 0 \0 1 \0 0000040 072 000 065 000 067 000 040 000 105 000 104 000 124 000 040 000 : \0 5 \0 7 \0 \0 E \0 D \0 T \0 \0 0000060 062 000 060 000 061 000 066 000 012 000 2 \0 0 \0 1 \0 6 \0 \n \0 0000072 

UTF-16LE를 가정하면

iconv -f UTF-16LE// -t UTF-8// <input >output 

코멘트

  • 어떻게하면 파일을 utf-8로 변환 할 수 있습니까? 내 의도는 모든 형식 (소스에서 온)을 utf-8로 변환하는 것입니다.
  • @St é phaneChazelas, @ Thomas 내 소스 인코딩을 찾으려면 어떻게하면 utf-에서 작동하지 않습니다. ' 32 (le / be) | 16 (le / be). 소스 파일 인코딩을 찾는 명령이 있습니까?
  • 제안 된대로 8 진 덤프를 표시하면 조언이 도움이됩니다 …
  • @St é phaneChazelas 아래는 작동했지만 " NUL "는 제거하는 것이 좋습니까? 고양이 filename.csv | tr -d ' \ 000 ' > out.csv 파일 -bi out.csv 텍스트 / 일반; charset = utf-8
  • @WilliamR, csv 파일의 해당 NUL 바이트는 아마도 파일이 텍스트 파일에서 예상되지 않는 방식으로 손상된 것과 같은 더 넓은 문제를 나타냅니다. '를 살펴 봐야합니다. csv 파일 (vim에서 ^@로 표시되어야 함)에서 표시되는 위치를 살펴보고 주변 데이터가 유효한지 확인합니다.

Answer

strings (binutils에서)가 ” iconvrecode도 모두 실패 할 때 파일에 인쇄 가능한 문자 문자열을 인쇄합니다. file는 여전히 콘텐츠를 바이너리 데이터로보고합니다.

$ file -i /tmp/textFile /tmp/textFile: application/octet-stream; charset=binary $ chardetect /tmp/textFile /tmp/textFile: utf-8 with confidence 0.99 $ iconv -f utf-8 -t utf-8 /tmp/textFile -o /tmp/textFile.iconv $ file -i /tmp/textFile.iconv /tmp/textFile.iconv: application/octet-stream; charset=binary $ cp /tmp/textFile /tmp/textFile.recode ; recode utf-8 /tmp/textFile.recode $ file -i /tmp/textFile.recode /tmp/textFile.recode: application/octet-stream; charset=binary $ strings /tmp/textFile > /tmp/textFile.strings $ file -i /tmp/textFile.strings /tmp/textFile.strings: text/plain; charset=us-ascii 

댓글

  • strings는 빈 줄을 유지하지 않습니다. 그 외에는 작업을 수행합니다.
  • @vulcanraven -w (--include-all-whitespace) 옵션에는 줄 바꿈 및 캐리지가 포함됩니다. 반환,

답변

https://pypi.python.org/pypi/chardet 를 사용하여 텍스트 인코딩을 결정한 다음 필요한 인코딩으로 변환 할 수 있습니다.

 pip install chardet chardetect /my/path/to/file  

file -i 인쇄하는 동안

application/octet-stream; charset=binary 

chardet가 올바르게 감지합니다.

ascii with confidence 1.0 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다