perl用空格替换非UTF-8字符或二进制内容

gkn4icbw  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(185)

我有一个包含非ascii字符的文件。

$ org od -t c -t x1 -A d tmp.txt
0000000   S   o   -   c   a   l   l   e   d    217    204   l   a   b
         53  6f  2d  63  61  6c  6c  65  64  f4  8f  b1  84  6c  61  62
0000016   e   l   e   d    217    204   p   a   t   t   e   r   n   s
         65  6c  65  64  f4  8f  b1  84  70  61  74  74  65  72  6e  73
0000032    217    204   c   a   n       b   e    217    204   u   s
         f4  8f  b1  84  63  61  6e  20  62  65  f4  8f  b1  84  75  73
0000048   e   d    217    204   w   i   t   h    217    204   s   i
         65  64  f4  8f  b1  84  77  69  74  68  f4  8f  b1  84  73  69
0000064   n   g   l   e   ,        217    204   d   o   u   b   l   e
         6e  67  6c  65  2c  20  f4  8f  b1  84  64  6f  75  62  6c  65
0000080   ,        217    204   a   n   d    217    204   t   r   i
         2c  20  f4  8f  b1  84  61  6e  64  f4  8f  b1  84  74  72  69
0000096   p   l   e    217    204   b   l   a   n   k   s   .
         70  6c  65  f4  8f  b1  84  62  6c  61  6e  6b  73  2e

如您所见,\x{f4}\x{8f}\x{b1}\x{84}出现了几次。我想用空格替换\x{f4}\x{8f}\x{b1}\x{84}。根据this,我尝试:

s/\x{f4}\x{8f}\x{b1}\x{84}/ /g;
tr/\x{f4}\x{8f}\x{b1}\x{84}/ /;

它不起作用。但如果我删除脚本中的这两行:

use utf8;
use open qw( :std :encoding(UTF-8) );

很管用。为什么?
我怀疑这是因为perl只处理字符,而\x{f4}\x{8f}\x{b1}\x{84}不被视为字符,有没有办法用perl删除\x{f4}\x{8f}\x{b1}\x{84}或任何其他二进制内容或非UTF-8字符?

polhcujo

polhcujo1#

虽然文件可能包含"\x{f4}\x{8f}\x{b1}\x{84}",但字符串也可以包含"\x{10FC44}"-"\N{U+10FC44}",因为您对所读取的内容进行了解码。

tr/\N{U+10FC44}/ /

这是一个专用代码点。要替换所有137,468个专用代码点,您可以使用

s/\p{General_Category=Private_Use}/ /g

General_Category可以缩写为Gc
Private_Use可以缩写为Co
可以省略General_Category=
所以这些是等价的:
第一个
Co让我想到了“控制”,所以最好避免使用这个词。(控制字符由Control(又名Cc)一般类别标识。)

相关问题