깨진 파일에서 이중 문자를 찾아 유니코드 단일 문자로 바꾸는 방법은 무엇입니까?

깨진 파일에서 이중 문자를 찾아 유니코드 단일 문자로 바꾸는 방법은 무엇입니까?

정리해야 할 긴 프랑스어 텍스트 파일이 있습니다. ASCII가 아닌 문자는 홀수 문자의 조합으로 대체되었습니다. 예를 들어 다음과 같습니다.

생일 축하해요.

다음과 같아야 합니다. (유니코드 텍스트로)

지나가시는 분들 행복한 연말 보내세요.

sed를 시도했지만 성공하지 못했습니다. 친구가 Perl을 사용해 보라고 추천했습니다. 이상한 문자 시퀀스와 올바른 대체 문자가 포함된 테이블을 쉽게 만들 수 있습니다. 이상적으로는 나중에 사용할 수 있도록 테이블을 독립형 파일로 만들고 싶습니다. 이러한 유형의 전환에 권장되는 접근 방식은 무엇입니까?

답변1

텍스트가 utf-8(Unix 표준이므로 괜찮음)로 인코딩된 것처럼 보이지만 뭔가 ISO 8859-1/Microsoft's Windows Latin-1로 읽힌 다음 해당 해석을 출력합니다. 이것을 뒤집어야 합니다.

예를 들어

echo "passer de très bonnes fêtes de fin d'année" | iconv --to-code="ISO 8859-1"

그러면 깨진 인코딩이 유효한 UTF-8로 변환됩니다. 시스템이 utf-8로 구성되어 있으면 올바르게 읽혀집니다.

설명: 이렇게 하면 echo è | od -t x116 echo ê | od -t x1진수 코드가 c3 a8 0a합계 라는 것을 알 수 c3 aa 0a있고 여기를 봅니다.http://www.ascii-code.com/(이것은 ASCII가 아닌 ISO 8859-1 코드입니다.) 우리는 이 코드가 èê뒤에 보이지 않는 문자가 오는 것을 볼 수 있습니다. 이제 우리는 무엇이 잘못되었는지 알고 있습니다. UTF-8을 읽지만 ISO 8859-1로 해석하는 것입니다. 따라서 이제 이를 뒤집어야 합니다. 읽고 있는 형식이 무엇이든 읽고 ISO 8859-1(여기에 있는 것과 반대)로 변환해야 합니다. 결과는 유효한 utf-8입니다.

답변2

원본 포스터가 제시하는 모지바케에는 두 가지 이유가 있을 수 있습니다.

  1. 파일에는 UTF 형식의 프랑스어 텍스트가 포함되어 있지만 파일을 잘못 표시하는 프로그램은 UTF-8 대신 ISO 8859-1 또는 Windows-1252 인코딩을 사용합니다.
  2. 이중 인코딩: 기본적으로 Richard가 말한 것입니다.

해결책은 다음과 같습니다.

  1. UTF-8 로케일을 사용하는 응용프로그램에서 읽습니다.
  2. 노력하다iconf -f UTF-8 -t Windows-1252 <정크 파일          또는iconf -f UTF-8 -t ISO-8859-1 <정크 파일      , 출력에 의미 있는 UTF-8 텍스트가 있을 것으로 예상됩니다.

그러나 텍스트가 더 손상되었을 가능성이 있으며(전문가의 경우: 예: UTF로 인코딩된 U+00C7 Ç \303\207, ISO-8859-1의 C1 제어 코드로 읽기가 제거됨) 자동 변환이 더 이상 불가능합니다. 그렇다면 자동 검색 및 바꾸기(Richard의 답변 아래 설명 참조)를 통해 최소한 일부 원본 문자를 복원할 수 있습니다.

관련 정보