我有一個包含非 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}用空格替換。據此,我嘗試:
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}不被視為字符。有沒有辦法\x{f4}\x{8f}\x{b1}\x{84}用 perl 洗掉或任何其他二進制內容或非 UTF-8 字符?
uj5u.com熱心網友回復:
雖然檔案可能包含"\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=可以省略。
所以這些是等價的:
s/\p{Gc=Private_Use}/ /g
s/\p{Private_Use}/ /g
s/\p{Co}/ /g
Co讓我想到“控制”,所以最好避免那個。(控制字符由Control又名Cc一般類別標識。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/506216.html
標籤:perl
下一篇:遍歷陣列忽略\n
