【发布时间】:2013-08-29 10:11:49
【问题描述】:
问题说明 - 我正在处理一些数据文件。在那个数据转储中,我有一些字符串,其中包含字符的 unicode 值。字符可能是大写和小写。现在我需要对这个字符串做下面的处理。
1- 如果有 - , _ ) ( } { ] [ ' " 则删除它们。所有这些字符都以 Unicode 形式存在于字符串中,为 ($4-hexa-digits)
2- 所有大写字符都需要转小写(包括所有不同的unicode字符'Φ' -> 'φ', 'Ω' -> 'ω', 'Ž' -> 'ž')
3- 稍后我将使用这个最终字符串来匹配不同的用户输入。
问题详细描述--我有一些字符串,例如Buna$002C_Texas , Zamboanga_$0028province$0029 等等。
这里 $002C, $0028 和 $0029 是 unicode 值,我正在使用下面将它们转换为它们的字符表示。
$str =~s/\$(....)/chr(hex($1))/eg;
或
$str =~s/\$(....)/pack 'U4', $1/eg;
现在我根据我的要求替换所有字符。然后我将字符串解码为 utf-8 以获取包括 unicode 在内的所有字符的小写,如下所示,因为 lc 直接不支持 unicode 字符。
$str =~ s/(^\-|\-$|^\_|\_$)//g;
$str =~ s/[\-\_,]/ /g;
$str =~ s/[\(\)\"\'\.]|ʻ|’|‘//g;
$str =~ s/^\s+|\s+$//g;
$str =~ s/\s+/ /g;
$str = decode('utf-8',$str);
$str = lc($str);
$str = encode('utf-8',$str);
但是当 Perl 尝试解码字符串时,我遇到了错误。
Cannot decode string with wide characters at /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/Encode.pm line 173
此错误也很明显,如此处所述。 @http://www.perlmonks.org/?node_id=569402
现在我按照上面的 url 改变了我的逻辑。我在下面使用将 unicode 转换为字符表示。
$str =~s/\$(..)(..)/chr(hex($1)).chr(hex($2))/eg;
但是现在我没有得到字符表示。我得到了一些不可打印的字符。 那么当我不知道会有多少不同的 unicode 表示时如何处理这个问题。
【问题讨论】:
-
您不需要转义
_、()或"'。而破折号-只是字符类括号[ ... ]内的一个元字符。