如何在perl中使用CHR将大数值打印为ASCII



要生成ascii值并输入$bitmask,我使用:

perl -E 'say chr 101' > value_ascii.txt

当我尝试为数字1185644生成ascii值时,我的问题出现了。也就是说,现在我希望$bitmask的值是对应于数值1185644的ascii值。

如果我使用perl -E 'say chr 1185644' > ascii_expected.txt,我没有得到从1185644第n个子集到1185744第n个子集的正确范围。所以我认为转换perl -E 'say chr 1185644' > ascii_expected.txt不起作用。

我一直试图正确获取的ascii值1185644做:

perl -E 'say chr 1185644' > ascii_expected.txt

但是打印出来的是:

ô¡<0x9d>¬

:

Wide character in say at -e line 1.

我试着去理解如何使用它:

sub nice_string {
join("",
map { $_ > 255                    # if wide character...
? sprintf("\x{%04X}", $_)  # x{...}
: chr($_) =~ /[[:cntrl:]]/  # else if control character...
? sprintf("\x%02X", $_)  # x..
: quotemeta(chr($_))      # else quoted or as themselves
} unpack("W*", $_[0]));           # unpack Unicode characters
}
nice_string("foox{1185644}barn")

但我不能

似乎不是正确的值。

I tried to do:

use open OUT => ':locale'; 
open(O, ">koi8");
print O chr(1185644); 
close O;

但是我的输出打印到文件是:

x{12176C}

:

Code point 0x12176C is not Unicode, may not be portable in print at p1.pl line 3.

注意:我期望1185644的ascii_value,这样我就可以将它用作变量,例如perl中的$b = 'ascii_value';

当我尝试为数字1185644生成ascii值时,我的问题出现了

这没有意义。ASCII字符集只有128个不同的字符(0-127)。

我希望$bitmask的值是对应于数值1185644的ascii值

创建一个由值为1185644的字符组成的字符串,可以使用chr(1185644)

get error:Wide character in say at -e line 1.

没有添加编码层的文件句柄期望字节串,也就是说每个字符的值在0..255之间的字符串。1185644显然不在该范围内,因此您提供了一个无效字符串。当发生这种情况时,Perl假定您打算使用utf8[1]对字符串进行编码,并这样做,但是警告您发生了这种情况("Wide character")。

我的输出打印到文件是:x{12176C}

当文件句柄有编码层时,期望提供Unicode代码点。[2]Unicode Code Point 1185644不是KOI-8字符集的一部分,因此不能被KOI-8编码。x{12176C}被用来代替不可编码的字符。


所以你要求做一些不可能的事情。那你到底想要做什么?嗯,目前还不清楚,但是也许您希望能够在文件中存储包含字符1185644的字符串,以便您可以取回它。据我所知,只有一种字符编码可以编码Unicode以外的字符,那就是utf8(不要与UTF-8混淆)。[1]可以编码Perl字符串支持的任何字符。

当然,您可以使用自己的格式。例如,我们可以将UCS-4be扩展到64位:

pack "Q>*", unpack "W*", $s     # "UCE-8be" encoder

但是人们不得不怀疑为什么要使用大字符字符串。


  1. utf8是perl特有的UTF-8扩展。

  2. 大于Unicode支持的值也被某些编码所接受。1185644就是这样一个值。由于找不到更好的名字,我还是叫它们统一码点。这并不排除1185644是一个有效的输入。

最新更新