在字节级读取unicode字符

时间:2012-12-17 21:49:00

标签: perl unicode byte

假设我想检测unicode字符并使用\u表示法对它们进行编码。如果我不得不使用字节数组,我可以遵循简单的规则来检测属于单个字符的字节组吗?

我指的是需要为仅ASCII接收器编码的UTF-8字节。目前,非ASCII-Printable字符被剥离。 s/[^\x20-\x7e\r\n\t]//g

我想改进此功能以编写\u0000表示法。

1 个答案:

答案 0 :(得分:2)

您需要拥有Unicode字符,因此请先解码字节数组。

use Encode qw( decode );
my $decoded_text = decode("UTF-8", $encoded_text);

只有这样才能转义Unicode字符。

( my $escaped_text = $decoded_text ) =~
   s/([^\x0A\x20-\x5B\x5D-\x7E])/sprintf("\\u%04X", ord($1))/eg;

例如,

$ perl -CSDA -MEncode=decode -E'
   my $encoded_text = "\xC3\x89\x72\x69\x63\x20\xE2\x99\xA5\x20\x50\x65\x72\x6c";
   my $decoded_text = decode("UTF-8", $encoded_text);
   say $decoded_text;
   ( my $escaped_text = $decoded_text ) =~
      s/([^\x0A\x20-\x5B\x5D-\x7E])/sprintf("\\u%04X", ord($1))/eg;
   say $escaped_text;
'
Éric ♥ Perl
\u00C9ric \u2665 Perl