MIME 인코딩을 재귀적으로 변환하는 방법(us-ascii에서 utf-8로)

MIME 인코딩을 재귀적으로 변환하는 방법(us-ascii에서 utf-8로)

us-ascii인코딩 파일이 거의 없습니다. 나는 그것들을 재귀적으로 변환하고 싶습니다 utf-8.

명령을 사용하고 있는 파일을 찾으려면

find . -name "*.adoc" -type f -exec file --mime-encoding {} \; | grep -v ": us-ascii"

출력은 다음과 같습니다.

./sds.adoc: us-ascii
./docker/misc/terms.adoc: us-ascii
./docker/misc/tools.adoc: us-ascii
./docker/basics-containers.adoc: us-ascii
./web-scraping/links.adoc: us-ascii
./system-design/reference-architecture.adoc: us-ascii
./system-design/replication vs load balancing.adoc: us-ascii
./system-design/performance.adoc: us-ascii
./system-design/links.adoc: us-ascii
./system-design/disaster-recovery.adoc: us-ascii

변환하려면 사용해야 할 것 같아요.iconv -f us-ascii file.adoc -t UTF-8 -o file.adoc

어떻게 해야 할지 모르겠습니다.

답변1

US-ASCII는 UTF-8의 하위 집합입니다. US-ASCII는 U+0000부터 U+007F까지의 문자만 다루고, 이러한 문자의 인코딩은 US-ASCII에서 UTF-8과 동일합니다(바이트 값은 유니코드 코드 포인트에 해당함(U의 바이트 값은 바이트 0x41 ) +0041 문자( A예: )).

그래서 당신이 할 수 있는 일은 아무것도 없습니다. 파일이 이미 UTF-8 형식입니다.

fileus-ascii를 보고하는 이유는 살펴본 작은 하위 집합에서 텍스트처럼 보였고 0x7f보다 큰 바이트 값이 없었으며 아마도 사용된 문자 분포가 다른 7비트 문자 집합(예: EBCDIC)보다 작았기 때문일 것입니다. ASCII일 가능성이 높습니다.

이것들을 실행하는 것은 iconv -f us-ascii -t UTF-8기껏해야 아무것도 하지 않고 최악의 경우 뭔가 file잘못되고 0x7f보다 높은 바이트 값이 있기 때문에 데이터를 잃을 것이기 때문에 비생산적입니다(UTF-8 또는 U+007F보다 높은 다른 인코딩 문자 설정의 문자에 대해). ) 보지 않은 부분은 iconv오류로 인해 중단되어 불완전한 파일이 남습니다.


1 추측으로, 일반적으로 안정적으로 결정할 수 없는 텍스트 파일 문자 집합을 추측하기 위해 어떤 경험적 방법을 사용하는지 확인하려면 libmagic 코드를 살펴봐야 합니다.

답변2

다음과 같이 시도해 보세요.

find . -name '*.adoc' -type f -execdir sh -c '
  for f; do
    file --mime-encoding "$f" | grep -qi us-ascii &&
      bn="$(basename "$f" .adoc)" && 
      iconv -f us-ascii "$f" -t UTF-8 -o "$bn-utf8.adoc"
  done' sh {} +

이는 파일이 포함된 cd모든 디렉터리로 이동 하며, (해당 디렉터리의 모든 .adoc 파일에 대해) 파일이 us-ascii로 표시된 경우 이를 사용하여 다른 출력 파일 이름을 사용하여 utf-8로 변환합니다. ..adocfileiconv

참고: 이 -execdir옵션은 비표준이며 GNU 또는 BSD 버전이 필요합니다 find. GNU는 Linux의 표준입니다.


원본 us-ascii 파일을 utf-8 버전으로 바꾸려면 &&이 줄 끝 iconv과 바로 뒤에 다음 줄을 추가하세요.

  mv "$bn-utf8.adoc" "$f"

관련 정보