2012-04-06 67 views
1

我想用短劃線替換具有某些Unicode值的字符。我有兩個想法可以工作,但我不知道如何檢查字符的值:檢查字符串內的字符以獲取其Unicode值

1 /處理變量作爲字符串,檢查每個字符值並將這些字符放在一個新變量中(替換那些字符是無效的)

2 /使用這些魔術:-)

$variable = s/[$char_range]/-/g; 

char_range應類似於[0-9][A-Z],但它應該爲UTF-8字符是數值。我需要從0x00到0x7F的範圍。

+0

從0x00到0x7F的字符範圍恰好是ASCII,那麼爲什麼要將UTF-8拖入此處? – jwodder 2012-04-06 19:21:36

+2

有沒有這樣的事情作爲UTF-8字符。只有您編碼爲UTF-8的字符。 – 2012-04-06 21:09:57

+0

感謝清除,順便說一句,這是有趣的http://perldoc.perl.org/Encode.html#UTF-8-vs.-utf8-vs.-UTF8 – rluks 2012-04-07 07:35:59

回答

2

下面的表達式應該更換什麼,是不是有一個連字符,這是(我認爲)你想做什麼ASCII:

s/[\N{U+0080}-\N{U+FFFF}]/-/g 
+0

否定確實影響整個範圍不只是開始和結束價值?不應該是s/[\ N({U + 0080} - {U + FFFF})]/-/g – rluks 2012-04-06 20:14:56

+0

\ N {}表示Unicode,而不是否定。字符類中的否定使用插入符號^。例如[^ 0-9]匹配不在0到9範圍內的任何內容。 – 2012-04-06 20:21:33

+2

更簡單的方法是使用否定的屬性:'\ P {ASCII}'。對於一個特定的序數值,使用'\ x {#####}'''有點清晰。 – 2012-04-06 21:16:52

1

還有爲UTF-8字符沒有這樣的事情。只有您編碼爲UTF-8的字符。即使那樣,你也不想在Perl知道的魔法之外創建範圍。你可能會獲得比你期望的更多。

要得到一個字符的順序值,使用ord

use utf8; 
my $code_number = ord ''; # U+1F638 

say sprintf "%#x", $code_number; 

不過,我不認爲這就是你所需要的。這聽起來像你想用-替換ASCII範圍中的字符。您可以指定範圍內的編號:

s/[\000-\177]/-/g; # in octal 
s/[\x00-\x7f]/-/g; # in hexadecimal 

您可以在括號中註明寬字符順序值:

s/[\x80-\x{10ffff}]/-/g; # wide characters, replace non-ASCII in this case 

當人物都有一個共同的屬性,你可以使用:

s/\p{ASCII}/-/g; 

但是,如果要替換字符的字符,則可能需要音譯:

$string =~ tr/\000-\177/-/; 
+0

爲什麼你不編輯你的文章只是's /國/ -/g' ..? – 2012-04-07 01:33:13

+1

我爲什麼要那樣做?我不是取代國家。我知道你是Perl新手,但是,正如你注意到的那樣,你會犯很多錯誤。您可能想退後一步,只讀一點答案。或者,學習Perl。 – 2012-04-07 02:08:34

+0

使用ORD,這是一個很好的方式來做到這一點 – rluks 2012-04-07 07:33:28