퍼센트로 인코딩 된 모든 UTF-8 서브 스트링을 일반 UTF-8 텍스트로 바꾸는 방법은 무엇입니까?


9

URL에 % 인코딩 된 UTF-8 텍스트가 많은 html 파일이 있습니다.

예를 들어 "% D1 % 80 % D0 % B5 % D1 % 81 % D1 % 83 % D1 % 80 % D1 % 81 % D1 % 8B"는 "ресурсы"(러시아의 "리소스")를 나타냅니다.

작업은 그러한 모든 하위 문자열을 읽을 수있는 UTF-8 텍스트로 바꾸는 것입니다.

작업을 단순화하기 위해 %파일에 다른 부호 사용법 이 없다고 생각할 수 있습니다 . 문자 숫자는 대문자와 소문자 일 수 있습니다.

나는이 우아하게 수행 할 수 있습니다 의심 sed, perl, awk또는 뭔가하지만 방법을 모르겠어요.

이 웹 응용 프로그램 은 붙여 넣은 텍스트로 트릭을 수행하는 것 같습니다.

답변:


9

일부 시스템에서 bash, zsh, GNU echo 또는 일부 ksh 구현을 사용하면이 echo -e를 모두 %로 바꾼 후에 간단히 디코딩 할 수 있습니다 \x.

url_encoded_string="%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B"
temp_string=${url_encoded_string//%/\\x}

printf '%s\n' "$temp_string"
# output: \xD1\x80\xD0\xB5\xD1\x81\xD1\x83\xD1\x80\xD1\x81\xD1\x8B

echo -e "$temp_string"
# output: ресурсы

(문자열 자체에 백 슬래시 문자가 포함되어 있지 않으며 echo명령에서 지원하는 옵션 중 하나가 아니라고 가정 )

@JoshLee도 지적했듯이 다음을 직접 사용하여 "에코주의 사항"을 피할 수 있습니다.

printf ${url_encoded_string//%/\\x}

대신 첫 번째 명령 바로 뒤에 있습니다.


이 우아한 솔루션은 UTF-8뿐만 아니라 모든 인코딩에서 작동 합니다 (예 : ~ 및 기타의 인코딩을 제거하십시오. 내 도구 상자에 추가하는 또 다른 트릭입니다. 감사합니다!
vonbrand

5

펄로 :

perl -pe 's/%([0-9A-F]{2})/pack"H2",$1/gei'

또는과 URI::Escape:

perl -MURI::Escape -pe '$_=uri_unescape$_'


@Nemo, $_여기 perl$_,하지 bash의. 이 -p옵션 과 함께 perl 표현식은 모든 입력 레코드 (인수가 제공되지 않은 경우 인수 또는 stdin으로 제공된 파일에서 읽은 레코드)에 대해 실행되며 현재 레코드는에 저장됩니다 $_. 즉 비슷 awk$0.
Stéphane Chazelas

0

convmv도움이 될 수 있는 프로그램 이 있습니다.

간단하게 사용하십시오 convmv --unescape /some_path/target_file. 드라 이런을합니다.

확인한 후에는 convmv --notest --unescape /some_path/target_file계속 진행하십시오.

이 프로그램의 홈페이지는 다음과 같습니다 : http://j3e.de/linux/convmv/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.