알 수 없는 8비트 파일을 utf8로 변환하는 방법

알 수 없는 8비트 파일을 utf8로 변환하는 방법

우분투의 gEdit에서 열면 왜곡되어 나타나는 .srt 파일이 있습니다. 그래서 그것을 읽을 수 있도록 utf8로 변환하고 싶습니다.

어떤 인코딩이 제공되는지 찾으려고 하면 다음과 같습니다.

file -i x.srt 
x.srt: text/plain; charset=unknown-8bit

또 다른 시도에서 다음을 발견했습니다.

find .  -type f -print | xargs file
./x.srt:   Non-ISO extended-ASCII text, with CRLF line terminators

나는 또한 enca를 시도했다:

enca x.srt 
enca: Cannot determine (or understand) your language preferences.
Please use `-L language', or `-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run `enca --list languages' to get a list of supported languages.

그리고

enca -L Persian  x.srt 
enca: Cannot determine (or understand) your language preferences.
Please use `-L language', or `-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run `enca --list languages' to get a list of supported languages.

그래서 인코딩을 알고 최종적으로 사용 가능한 형식으로 변환하는 방법을 알고 싶습니다.

답변1

알 수 없는 인코딩을 알려진 인코딩으로 변환하는 안정적인 방법은 없습니다.

귀하의 경우 원본 텍스트가 페르시아어/페르시아어로 되어 있다는 것을 알고 있다면 가능한 인코딩 수를 식별하고 원하는 출력이 나타날 때까지 이를 반복할 수 있습니다.

빠른 구글 검색 결과 표준적이고 안정적인 레거시 변환기가 없습니다.이란 시스템 인코딩, 남은 유일한 대중적인 대안은Windows 코드 페이지 1256. 나는 포함했다아라비아 말주로 설명을 위한 목적으로 여기에 있습니다(Farsi에 대한 실행 가능한 대안이 될 수도 있지만).

for encoding in cp1256 macarabic; do
    if iconv -f "$encoding" -t utf-8 inputfile >outputfile."$encoding"; then
        echo "$encoding: possible"
    else
        echo "$encoding: skipped"
        rm outputfile."$encoding"
    fi
done

(내 버전은 iconv실제로 MacArabic을 지원하지 않지만 운이 더 좋을 수도 있고 다른 변환 도구를 사용해 볼 수도 있습니다.)

생성된 출력 파일을 확인하여 그 중 하나가 적합한지 확인하세요.

출력이 어떤 모양이어야 하는지 알고 있는 경우 파일에서 개별 바이트 매핑을 찾을 수도 있습니다. 첫 번째 바이트가 0x94이고 ﭖ로 읽어야 한다는 것을 알고 있다면 기본적으로 인코딩이 이란 시스템용이라고 판단한 것입니다. 이 결론을 확인하기 위해 몇 바이트를 더 확인해 보세요. 이 인코딩에 대한 Wikipedia 페이지에는 모든 문자가 포함된 표가 있습니다. 분명히 이것은 힘들고 느리며 오류가 발생하기 쉬운 프로세스입니다. 특히 선택할 후보 인코딩이 많은 경우에는 더욱 그렇습니다.

일부 인코딩의 경우 다음과 같은 목록을 찾을 수 있습니다.https://tripleee.github.io/8bit/- 다른 경우에는 해당 Wikipedia 코딩 테이블을 살펴보아야 할 수도 있습니다.

답변2

알 수 없는 8비트 코드 페이지의 파일이 "알 수 없는 8비트"로 식별되는 이유가 있습니다. 언어에 대한 지식이 없으면 이는 간단한 문제가 아닙니다. 불가능하다고 말할 수는 없지만 효과적으로 작동하려면 이러한 휴리스틱 탐지기가 가장 일반적으로 사용되는 모든 언어에 대한 방대한 어휘, 대규모 코드 페이지 목록을 보유하고 일부 구문을 알아야 합니다. 업데이트: 시도해본 적이 없음enca;어쩌면 이것은 이런 맥락에서 만들어진 마법의 디코더일지도 모릅니다. 그러나 파일이 대부분 ASCII 소스 코드를 나타내며 상위 옥텟으로 구성된 한두 단어만 포함된 경우 이러한 마법의 경험적 방법을 사용해도 언어와 인코딩을 추측하는 것은 사실상 불가능합니다. 이것이 원래 HTTP/1.1이 Content-Type:모든 미디어 유형에 대해 HTTP 헤더 에 text/문자 집합을 선언해야 한다고 강력히 주장한 이유입니다.

따라서 솔루션은 다음과 같은 점으로 구분됩니다.

  1. 파일을 어떤 언어로 인코딩해야 하는지 조사/학습/추측하세요. 여기서 인간의 지혜가 중요합니다. 최소한 몇 가지 그럴듯한 가정을 나열하십시오.
  2. 컴파일된 언어에서 사용되는 인코딩 목록입니다.
  3. 다음 인코딩을 시도해 보세요.head문서 |iconv -f노력하다(사용된 TUI에 따라 LANG 환경 변수가 설정되었다고 가정) 성공할 때까지 결과를 읽을 수 있는지 확인하세요.

물론 이 솔루션은 텍스트가 인코딩되어 있다고 가정합니다.적절하게하지만알려지지 않은코드 페이지. 사람의 실수나 소프트웨어 결함으로 인해 텍스트가 왜곡되는 상황은 이 방법으로는 해결할 수 없습니다.

포인트 2와 3은 자동화될 수 있으며 그러한 도구가 존재하지만 언어에 따라 다르거나(예: 러시아어의 경험적 디코더가 일본어에서는 작동하지 않고 그 반대도 마찬가지) 최소한 입력 언어를 지정해야 합니다(예:enca하다).

페르시아어의 경우 가능한 인코딩에는 Windows-1256이 포함됩니다(참조:이 스레드), ISO 8859-6, 이제 더 이상 사용되지 않음이란 시스템 인코딩. 다행스럽게도 러시아어(KOI7, KOI8, CP866, Windows-1251, ISO 8859-5, MacCyrillic, MIK)에 대한 최소 7개의 코드 페이지 목록이 없습니다.

답변3

어쩌면 all.txt 결과에 병합된 각각의 처음 20줄을 나열하여 iconv에 대한 ~1000개의 가능성을 모두 시각적으로 확인할 수 있습니다.

#!/usr/bin/env bash
                      line=$(printf "=%.0s" {1..50})
for FMT in $(iconv -l); do    
                   echo "$line\nFormat $FMT:\n$line"
   iconv -f $FMT -t UTF8 < inputFile.srt | head -n20
done > all.txt

#gedit all.txt

...그리고 어떤 형식이 올바른지 알아보세요(페르시아어를 인식할 수 있는 경우).

관련 정보