私はいくつかのトレーニングを開発しており、ファイルエンコーディングを実演したいと思いました。私が達成したいのは、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進数)。落ち込んで...)
これはUnicodeから来たものです。全幅範囲U+FF01から始まります。もっと楽しく遊べました。混乱した場所。
これはクレイジーな方法です。
まず、オートメーションまたはフレーズを手動で貼り付ける方法を使用して、非標準のUnicode範囲のテキストを生成する方法が必要です。以下は、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|
...