유닉스의 문자 집합에 대해 혼란스러워요. SFTP를 통해 CSV 파일을 다운로드했습니다.
$ file -ib myfile
text/plain; charset=us-ascii
이 문자 집합 작업의 목적은 파일의 데이터가 다음과 같아지는 것입니다.
Flyers: Video Center
내가 원하지만 :
Flyers: Video Center
나는 시도했다:
iconv -f us-ascii -t utf-8 myfile
다음과 같은 오류가 발생합니다.
iconv: illegal input sequence at position 528666
문자 집합에 대해 명확히 해주세요. SFTP를 통해 파일을 가져올 때 UTF-8 형식으로 파일을 다운로드할 수 있나요? 일반적으로 문자 집합에서 쓰레기가 무엇인지 어떻게 결정합니까?
$Locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
$ LC_ALL=C sed -n l
Zimbabwe,175,Unknown Network,-1,Unknown,-1,Unknown,-1,US: Flyers: Video Center:,854088,Standard Display,-998,10/28/2014
$ iconv -f utf-8 -t l1
iconv: illegal input sequence at position 1228354
터미널을 설정할 때(번역 중 charset은 UTF-8) 깨끗한 데이터를 볼 수 있습니다.
그러나 ETL 도구를 사용하여 이를 UTF-8 인코딩으로 읽으면 데이터가 가비지로 읽혀집니다.
파일의 데이터를 grep할 때
"Flyers: Video Center"
데이터가 다음과 같이 저장되었다는 결과가 표시되지 않습니다.
"Flyers: Video Center"
원하는 내용을 볼 수 있도록 파일 인코딩을 변경할 수 있나요?
가비지 문자의 16진수 덤프:
0000000: 4e42 4353 3a20 4e48 4c2e 636f 6d3a 2055 NBCS: NHL.com: U
0000010: 533a 2046 6c79 6572 733a c2a0 5669 6465 S: Flyers:..Vide
0000020: 6fc2 a043 656e 7465 723a 2057 6861 7427 o..Center: What'
0000030: 7320 486f 740a s Hot.
$dd bs=1 skip=1228300 count=100 < temp1.csv | xxd
100+0 records in
100+0 records out
100 bytes (100 B) copied, 0.000141 seconds, 709 kB/s
0000000: 3031 342c 320a 556e 6b6e 6f77 6e20 436f 014,2.Unknown Co
0000010: 756e 7472 792c 2d31 2c48 756c 7520 4c69 untry,-1,Hulu Li
0000020: 7665 2c33 3738 3834 312c 4e42 433a 2041 ve,378841,NBC: A
0000030: 6d65 7269 6361 e280 9973 2047 6f74 2054 merica...s Got T
0000040: 616c 656e 743a 2053 686f 7274 666f 726d alent: Shortform
0000050: 2c33 3230 3631 3332 2c55 6e6b 6e6f 776e ,3206132,Unknown
0000060: 2053 6974 Sit
일부 왜곡된 텍스트:
Junk Americaâs
이어야 합니다(아포스트로피는 이것이 '하지만'이 아님을 주의하세요)
America’s
그리고
BMW â Golden
다음과 같아야 합니다(하이픈은 긴 하이픈이며 이것이 아님에 유의하세요).
BMW – Golden
답변1
문제 #1: "Flyers: Video Center"를 검색합니다...결과가 없습니다.:
파일의 16진수 덤프에서 단어 사이에 2바이트 C2A0이 있음을 확인하세요.전단:그리고동영상. UTF8 인코딩입니다.중단되지 않는 공간.grep NBSP는 실패하는 것으로 알려져 있습니다.더 많은 정보를 원하시면 읽어주세요sed를 사용하여 특수 "M-BM-" 문자를 삭제하는 방법그리고sed를 사용하여 대체...Hex c2a0. 짧은 대답은 다음과 같습니다.
sed -i.bak -e 's/\xc2\xa0/ /' /path/to/file
질문 #2 "America's"는 "Americaâs"(??)로 나타납니다.:
여기서 덤프에는 e28099라는 3바이트가 포함되어 있습니다.오른쪽 작은따옴표('). 사실 여기에는 아무런 문제가 없어야 합니다! 위의 질문으로 인해 주의가 산만해질 수 있습니다. (확인할 수 있습니까?)
grep
, 및 로케일을 존중하는 표현식(UTF8!)이 포함된 기타 도구를 사용하면 sed
다음과 같이 작동합니다.
printf 'America\xe2\x80\x99s\n' | grep --only-matching "[[:punct:]]"
printf 'America\xe2\x80\x99s\n' | sed -e "s/[[:punct:]]/?/"
UTF-8을 모두 제거하고 싶다면"특별한" 문자를 사용하려면 위의 팁을 사용할 수 있습니다. iconv
(하지만 이제 UTF8을 지원하지 않을 이유가 거의 없습니다.)
ASCII가 아닌 문자를 모두 제거합니다.
type a.txt | iconv -f utf8 -t ASCII//TRANSLIT
또는 한 로캘의 문자를 보존합니다.
type a.txt | iconv -f utf8 -t iso8859-15//TRANSLIT | iconv -f iso8859-15 -t utf8
답변2
같지 않은XML, 해당 정보에 대해 다른 방법으로 csv를 가져와야 했던 원본 콘텐츠 인코딩을 설명하는 인코딩 태그가 포함되어 있어야 합니다.
하지만유형이진 데이터에는 적합하지만 텍스트 데이터에는 적합하지 않습니다.
이는 명령이 작동하는 방식 때문입니다. 바라보다남자의 텍스트. 대략적으로: 처음 몇 바이트를 살펴보고 조회 테이블에서 발견된 내용을 찾아 내용을 추측하려고 시도합니다.
따라서 일반적으로 콘텐츠 제작자에게 어떤 문자 집합을 사용했는지 물어보는 것이 가장 좋습니다.
이것이 불가능할 경우 - 어떤 이유로든상여기 당신의 가장 친한 친구가 있습니까?