演示文件编码

演示文件编码

我正在开发一些培训,并想演示文件编码。我想要完成的是创建一个具有一种编码类型的文本文件,该文件在 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.

图像对于编码问题也是必要的,因为一些显示软件会“豆腐”文本(白色矩形),而其他显示软件则显示得很好,或者对于如何呈现事物可能存在各种其他分歧,只有图像才能帮助澄清(好吧,图像和十六进制转储...)

豆腐与否

这些来自 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

尽管您确实需要一个十六进制查看器来检查结果:

% ./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|
...

相关内容