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

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

이진 문자 집합이 포함된 CSV 파일이 있는데 HDFS(Hadoop)에서 처리하려면 UTF-8로 변환해야 합니다.

다음 명령을 사용하여 문자 세트를 확인합니다.

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 명령을 사용하여 데이터를 볼 수 있는지 이해하는 데 도움을 줄 수 있습니까?

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

od -tc < 파일 이름.csv 헤더 |

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

답변1

"바이너리"는 그렇지 않습니다코딩(문자 세트 이름). iconv가 작업을 수행하려면 인코딩 이름이 필요합니다.

file유틸리티가 파일 형식을 인식하지 못하는 경우 유용한 정보를 제공하지 않습니다. 예를 들어 UTF-16BOM(바이트 인코딩 표시)이 없을 수 있습니다. notepad읽어보세요. 동일하게 적용됩니다 UTF-8( head표시됩니다.저것터미널이 UTF-8 인코딩으로 설정되어 있고 BOM은 신경 쓰지 않기 때문입니다.

head파일이 UTF-16인 경우 대부분의 문자가 ASCII(Latin-1도 포함)이고 UTF-16 문자의 "기타" 바이트는 비어 있으므로 터미널에서 파일을 표시합니다 .

두 경우 모두 버전에 따라 누락된 BOM이 file혼란스러울 수 있습니다. 그러나 이러한 파일 형식은 Microsoft Windows 및 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

답변2

stringsiconv(binutils에서) 둘 다 실패 recode하면 "파일에 인쇄 가능한 문자열을 인쇄" 하지만 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

답변3

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

답변4

먼저 이 명령을 사용하여 파일의 MIME 유형을 확인하고 싶습니다.

file -b --mime-type <yourfile>
file -b <yourfile>

확인한 후 application/octet-stream이 명령을 입력하세요.cat <yourfile> | tr -d '\0' > <yournewfile>

관련 정보