我有一个包含非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字符?
1条答案
按热度按时间polhcujo1#
虽然文件可能包含
"\x{f4}\x{8f}\x{b1}\x{84}"
,但字符串也可以包含"\x{10FC44}"
-"\N{U+10FC44}"
,因为您对所读取的内容进行了解码。这是一个专用代码点。要替换所有137,468个专用代码点,您可以使用
General_Category
可以缩写为Gc
。Private_Use
可以缩写为Co
。可以省略
General_Category=
。所以这些是等价的:
第一个
Co
让我想到了“控制”,所以最好避免使用这个词。(控制字符由Control
(又名Cc
)一般类别标识。)