检查字符串中的字符是否有Unicode值

时间:2012-04-06 19:19:51

标签: perl unicode utf-8

我想用破折号替换变量中某些Unicode值的字符。我有两个可能有用的想法,但我不知道如何检查字符的值:

1 /处理变量作为字符串,检查每个字符值并将这些字符放在一个新变量中(替换那些无效的字符)

2 /使用这些魔法: - )

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

char_range应类似于[0-9][A-Z],但它应该是utf-8字符的值。我需要从0x00到0x7F的范围。

2 个答案:

答案 0 :(得分:2)

以下表达式应该用连字符替换非ASCII的任何内容,这是(我认为)你想要做的事情:

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

答案 1 :(得分: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/-/;