2013-12-17 2 views
1

다른 텍스트로 된 큰 텍스트 파일이 있습니다. 일부는 단순한 ASCII이며, 일부는 UTF-8이고 일부는 이중 UTF-8과 같습니다.다른 유니 코드 스타일 변환/bash의 유니 코드 문자열 테스트

'Böker' 
'für' 

을 그리고 여기 less 보여줄 것이다 내용은 다음과 같습니다 : cat 그것을 같이 여기

는 파일의 내용이다

'BÃ<U+0083>¶ker' 
'für' 

이 (내가 좀하고 싶습니다 무엇 깨끗하고 ISO-8859- 1) :

'Böker' 
'für' 

iconv --from-code=UTF-8 --to-code=ISO-8859-1 사용이이다 결과 :

'Böker' 
'für' 

(동일한 매개 변수)를 두 번 iconv --from-code=UTF-8 --to-code=ISO-8859-1를 사용하여, 그것은 올바른 O를 제공하지만,뿐만 아니라 ü 해석 (less 출력) :

'Böker' 
'f<FC>r' 

한 가지 방법 것 bash에있는 모든 문자열을 테스트해야합니다. 현재이 코드는 유니 코드 형식으로되어 있습니다. 그러나이 코드는 꽤 많이 검색되었지만 적합한 대답을 찾을 수 없었습니다.

다른 접근법은 문자열을 올바른 형식으로 직접 변환하는 프로그램을 가지고 있지만 iconv와 같은 다른 프로그램을 찾을 수 없으며 < 이후로 FC >은 ISO-8859-1에서 완벽하게 유효한 문자이며, "-c"를 사용하거나 "// IGNORE"를 -to-code에 추가하지 않으면 출력이 변경되지 않습니다.

+0

_double-UTF-8_ - 이것은 문제가 아닙니다. 'BÃ Â ¶ker' - 이것은 ö가 너비가 4 옥텟이라는 것을 의미합니다. 하지만 UTF-32 또는 GB18030에서 볼 수있는 graphemes를 얻는 방법에 대해 고민하고 있습니다. UTF-8에서는 NFD에 [표준화 된] (http://unicode.org/reports/tr15/) 인 경우 2 바이트 또는 3 바이트가됩니다. 트랜스 코딩은 손실 될 수 있습니다 (잘못된 인코딩을 사용하여 디코딩하면 파괴적입니다).이 데이터가 버그가있는 변환의 결과라면 정확한 상태가 복구되지 않을 수 있습니다. – McDowell

+0

올바른 인코딩이 아니며 어떤 일이 발생했는지 설명하려고했습니다. 이것은 ö에 대해 같은 값을 재생산합니다 :'echo "ö"| iconv --from-code = ISO8859-1 --to-code = UTF-8 | iconv --from-code = ISO8859-1 --to-code = UTF-8'. 나는 입력 값을 그대로 가져 왔고 생성 된 방법에 영향을주지 않습니다. 문자를 여전히 디코딩해야하는지 여부를 테스트하는 방법은 적어도 있습니까? –

+0

당신이 할 수있는 최선의 방법은 [인코딩 탐지 API] (http://userguide.icu-project.org/conversion/detection)를 시도하는 것입니다. 그러나 이것들은 본질적으로 신뢰할 수 없습니다. "일반 텍스트"를 사용하면 인코딩을 알아야합니다. – McDowell

답변

0

일반적인 방법으로 'BÃker'와 'Böker'가 유효한 입력 일 수는 없지만 어떻게 해결할 수 있습니까? 일반적으로 데이터에 맞는 휴리스틱을 찾을 수 있습니다. 독일어 문자열이 대부분이거나 독일어 인 것 같으므로 문제가있는 문자는 ÄÖÜäöüß입니다. 하나의 접근법은 ISO-8859-1, UTF-8 및 이중 인코딩 된 UTF-8에서 이러한 문자에 대한 모든 항목을 검색하는 것입니다. 일치하는 항목이 있으면 해당 인코딩이 올바른 것으로 가정합니다.

bash을 사용하는 경우 $'\xnn' 구문을 사용하여 바이트 시퀀스를 grep 할 수 있습니다. grepC 로켈을 사용하는지 확인하면됩니다. 여기에 문자 ö (A UTF-8 콘솔에서 출력)에 대한 예입니다 :

$ cat test.txt 
B▒ker ISO-8859-1 
Böker UTF-8 
Böker Double encoded UTF-8 
$ LC_ALL=C grep $'\xF6' test.txt 
B▒ker ISO-8859-1 
$ LC_ALL=C grep $'\xC3\xB6' test.txt 
Böker UTF-8 
$ LC_ALL=C grep $'\xC3\x83\xC2\xB6' test.txt 
Böker Double encoded UTF-8 

그러나 펄이나 파이썬과 같은 스크립트 언어로이 문제를 해결하는 것이 더 쉬울 것입니다.