문자 인코딩이 손상된 웹사이트에서 일부 데이터를 추출하는 스크립트를 작성 중입니다.
- html 헤더는 iso-8859-1이라고 주장하지만 그렇지 않습니다.
wget
파일을 검사하면 실제로는 utf-8이지만 잘못된 문자가 있음이 표시됩니다.- 리버스 엔지니어링을 통해 누군가 Windows 코드 페이지 1252를 유니코드 코드로 사용했음을 알 수 있습니다!
예를 들어 백틱은 코드 페이지 1252에서는 0x91이고 이 페이지에서는 U+0091입니다. 이상한. 놀랍게도 웹 브라우저는 이 문제를 자동으로 해결할 수 있는 것 같습니다.
내 질문: 이 혼란을 정리하는 데 어떤 도구가 도움이 됩니까? (손으로 직접 만든 것이 아닙니다. 이 웹사이트는 수백 페이지로 구성된 동적 웹사이트이며, 적어도 6개 이상의 서로 다른 잘못된 인코딩을 보았습니다.)
답변1
"손으로 하지 않음"이 의미하는 바에 따라 iconv
작업에 유용할 수 있습니다.
iconv - 한 문자 인코딩에서 다른 문자 인코딩으로 텍스트 변환
옵션
-f from-encoding, --from-code=from-encoding Use from-encoding for input characters. -t to-encoding, --to-code=to-encoding Use to-encoding for output characters.
내 경험에 따르면, 잘못된 인코딩을 처리해야 하는 경우에도 iconv는 잘 작동합니다. 예를 들어 입력 데이터가 ISO-8859인 경우에도 UTF-8로 인코딩되었음을 iconv에 지시하여 iconv가 입력이 UTF-8인 것처럼 동작하도록 할 수 있습니다. 이렇게 하면 잘못 인코딩된 데이터를 수정할 수 있습니다.
iconv는 필터로 사용할 수 있으므로 와 같은 것과 함께 사용할 수 있습니다 . Link with는 curl
사용할 때도 wget
작동합니다 --output-document -
.
내가 아는 한, iconv는 올바른 입력 인코딩을 감지/추측할 수 없습니다. 그러나 입력 데이터가 얼마나 지저분한지에 따라 사이트에 다양한 유형의 오류/혼합 인코딩이 있는 경우 이는 "불가능"할 수 있습니다. 전체 사이트가 같은 방식으로 엉망이 된 경우 이를 수정할 수 있습니다.
답변2
locale
먼저 UTF-8을 사용해야 합니다 .
발각
chardetect
(python3-chardet 패키지에서, 일명 chardet)uchardet
, 인코딩 감지기 라이브러리(현재 freedesktop에 있음)enca
, 동부 및 중부 유럽 언어를 중심으로-
file --brief --mime-encoding FILE | awk '{print $2}' FS=':[ :]+'
일반적인 용의자는 CP850, CP437, latin1(ISO-8859-1이라고도 함), CP1252(windows-1252라고도 함)입니다.
내 경험에 따르면 이러한 도구는 일반적으로 작업을 수행하지 않습니다. 때로는 파일에 인코딩이 혼합되어 있을 수 있습니다.
나는 어딘가에서 이 무차별적인 작은 스크립트를 발견했습니다.
#!/bin/bash
# Usage string-encoding-detector.sh fileWithLiberaci°n.txt | grep Liberación
iconv --list | sed -e 's/\/\///g' | while read -r encoding
do
transcoded=$(head -n1 "$1" | iconv -c -f "$encoding" -t UTF-8)
echo "$encoding $transcoded"
done