perl-如何为每个字节打印utf8代码点

时间:2019-03-20 10:43:02

标签: perl

我正在尝试为所有可能的字节值打印代码点。

我的测试文件:

$ perl -e ' open($fh,">raw_bytes.dat");while($i++<256){ print $fh chr($i-1) } close($fh)'

$ ls -l raw_bytes.dat
-rw-rw-r--+ 1 uuuuu Domain Users 256 Mar 20 15:41 raw_bytes.dat
$ 

下面的#--->部分应该包含什么内容,以便我以十六进制格式打印utf8 $ x的代码点?

perl -e ' use utf8; open($fh,"<raw_bytes.dat");binmode($fh);
          while($rb=read($fh,$x,1)) { utf8::encode($x);
          #--->
          } ' 

我使用printf尝试了%02x,但是没有用。另外,我只需要使用核心模块的解决方案。

2 个答案:

答案 0 :(得分:2)

使用unpack('H*')

$ perl -e '$x="\x80"; utf8::encode($x); print unpack("H*", $x), "\n"'
c280

对于我的示例文件,

$ perl -e 'open($fh, "<", "raw_bytes.dat"); binmode($fh); 
           while ($rb=read($fh,$x,1)) { utf8::encode($x);
               print unpack("H*", $x), "\n";
           }'
00
01
02
03
...
7f
c280
c281
c282
c283
...
c3bd
c3be
c3bf

变量:

$ perl -e '$x="\x80"; utf8::encode($x);
           print uc(unpack("H*", $x)), "\n"'
C280

$ perl -e '$x="\x80"; utf8::encode($x);
           ($r = uc(unpack("H*", $x))) =~ s/(..)/\\X\1/g;
           print "$r\n"'
\XC2\X80

# a little bit pointless example, but assume that $x is a provided Perl scalar....
$ perl -e '$x="\N{U+0080}\N{U+0081}";
           printf("U+%04x ", ord($_)) foreach(split(//, $x));
           print "\n";'
U+0080 U+0081

请记住两者之间的区别

  • 持有原始字符串的标量:split(//)返回个八位字节,例如\x80
  • 包含正确编码的字符串的标量:split(//)返回字符,例如\N{U+0080}

答案 1 :(得分:2)

  

我使用printf尝试了%02x,但是没有用。

您可以使用

        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

根据perldoc sprintf

  

矢量标志

     

此标志告诉Perl将提供的字符串解释为   整数,字符串中每个字符一个。 Perl应用   依次将格式设置为每个整数,然后使用   分隔符(默认为点。)。这对于显示很有用   任意字符串中字符的序数值。