저는 몇 가지 교육을 개발 중이며 파일 인코딩을 시연하고 싶었습니다. 내가 달성하고 싶은 것은 Linux에서 읽을 때 말도 안되는 인코딩 유형으로 텍스트 파일을 만드는 것입니다.
그런 다음 파일을 UTF8 인코딩으로 변환하고 Linux에서 파일을 읽을 수 있습니다.
가능합니까?
답변1
GNU recode를 사용하여 인코딩 간에 변환할 수 있습니다. 이는 stdin에서 읽고 다음과 같이 호출됩니다.
recode from-encoding..to-encoding
예를 들어:
$ recode ascii..ebcdic < file.txt
또는 Windows-1252 인코딩에서 변환하면 더 관련성이 높습니다.
$ recode windows-1252..utf8 < extended-latin.txt
예를 들어 다음을 보여줍니다.
$ cat > universal-declaration-french.txt
Tous les êtres humains naissent libres et égaux en dignité et en droits.
Ils sont doués de raison et de conscience et doivent agir les uns envers
les autres dans un esprit de fraternité.
^D
$ recode utf8..windows-1252 < universal-declaration-french.txt > declaration-1252.txt
$ cat declaration-1252.txt
Tous les �tres humains naissent libres et �gaux en dignit� et en droits.
Ils sont dou�s de raison et de conscience et doivent agir les uns envers
les autres dans un esprit de fraternit�.
$ recode windows-1252..utf8 < declaration-1252.txt
Tous les êtres humains naissent libres et égaux en dignité et en droits.
Ils sont doués de raison et de conscience et doivent agir les uns envers
les autres dans un esprit de fraternité.
"recode -l"을 사용하면 지원하는 인코딩 목록을 볼 수 있습니다.
답변2
"Linux"가 Linux의 프로그램을 참조하는 경우 터미널 에뮬레이터의 인코딩이 UTF-8로 설정되어 있고 로케일이 UTF-8 로케일이라고 가정합니다.
$ cat > utf8.txt <<<"This is 日本語。"
$ iconv -f UTF-8 -t UTF-16 utf8.txt > utf16.txt
$ head utf*.txt
==> utf16.txt <==
��This is �e,g��0
==> utf8.txt <==
This is 日本語。
$ iconv -f UTF-16 -t UTF-8 utf16.txt
This is 日本語。
답변3
SHIFT-JIS는 읽기 어려운 내용을 인코딩할 수 있습니다.
% cat phrase
?k?????? ???????????? ???????? ?????? ?????????????? ????????????????????.
% hexdump -C phrase
00000000 82 6b 82 89 82 8b 82 85 20 82 91 82 95 82 89 82 |.k...... .......|
00000010 8c 82 8c 82 93 20 82 95 82 90 82 8f 82 8e 20 82 |..... ........ .|
00000020 94 82 88 82 85 20 82 86 82 92 82 85 82 94 82 86 |..... ..........|
00000030 82 95 82 8c 20 82 90 82 8f 82 92 82 90 82 85 82 |.... ...........|
00000040 8e 82 94 82 89 82 8e 82 85 2e 0a |...........|
0000004b
% iconv -f SHIFT-JIS -t UTF-8 < phrase
Like quills upon the fretful porpentine.
인코딩 문제에도 이미지가 필요합니다. 일부 디스플레이 소프트웨어에서는 "두부" 텍스트(흰색 직사각형)를 표시하지만 다른 소프트웨어에서는 이를 잘 표시하거나 이미지만 명확하게 하는 데 도움이 될 수 있는 사물이 표시되는 방식에 대해 다양한 의견 차이가 있을 수 있습니다(글쎄, 이미지 및 16진수). 우울...)
이것은 유니코드에서 온 것입니다.전폭 범위U+FF01부터 시작합니다. 더 재미있게 놀 수 있었을 텐데혼란스러운 장소.
이런 미친 방법이네
첫째, 자동화를 통해 또는 문구를 수동으로 붙여넣는 방법을 통해 비표준 유니코드 범위의 텍스트를 생성하는 방법이 필요합니다. 다음은 a-zA-Z
범위를 가져와 이를 전체 폭 범위로 변환하는 변환기입니다 .
#!/usr/bin/env perl
use 5.24.0;
use warnings;
die "Usage: not-ascii ...\n" unless @ARGV;
my $s = '';
for my $c ( split //, "@ARGV" ) {
if ( $c =~ m/[a-z]/ ) { # FF41
$s .= chr( 0xFF41 + ord($c) - 97 );
} elsif ( $c =~ m/[A-Z]/ ) { # FF21
$s .= chr( 0xFF21 + ord($c) - 65 );
} else {
$s .= $c;
}
}
binmode *STDOUT, ':encoding(UTF-8)';
say $s;
그런 다음 셰익스피어를 전폭으로 만들고 SHIFT-JIS를 사용하여 인코딩할 수 있습니다.
% not-ascii 'Like quills upon the fretful porpentine.' \
| iconv -f UTF-8 -t SHIFT-JIS > phrase
UTF-8 입력을 나열된 모든 인코딩으로 변환하기 위해 무차별 검색을 수행함으로써 우리는 SHIFT-JIS가 이 목적으로 사용될 수 있음을 발견했습니다 iconf -l
. 대부분의 다른 인코딩은 그다지 흥미롭지 않거나 UTF-8을 변환할 수 없습니다.
#!/bin/sh
IFS=' '
iconv -l | while read e unused; do
printf "$e "
printf "test phrase\n" | iconv -f UTF-8 -t "$e"
done
결과를 확인하려면 16진수 뷰어가 필요하지만:
% ./brutus-iconv > x
iconv: (stdin):1:0: cannot convert
iconv: (stdin):1:0: cannot convert
iconv: (stdin):1:0: cannot convert
iconv: (stdin):1:4: cannot convert
iconv: (stdin):1:0: cannot convert
% hexdump -C x
00000000 41 4e 53 49 5f 58 33 2e 34 2d 31 39 36 38 20 74 |ANSI_X3.4-1968 t|
00000010 65 73 74 20 70 68 72 61 73 65 0a 55 54 46 2d 38 |est phrase.UTF-8|
00000020 20 74 65 73 74 20 70 68 72 61 73 65 0a 55 54 46 | test phrase.UTF|
00000030 2d 38 2d 4d 41 43 20 74 65 73 74 20 70 68 72 61 |-8-MAC test phra|
...