【发布时间】:2010-12-07 00:35:23
【问题描述】:
Perl:
$string =~ s/[áàâã]/a/gi; #This line always prepends an "a"
$string =~ s/[éèêë]/e/gi;
$string =~ s/[úùûü]/u/gi;
这个正则表达式应该将“été”转换成“ete”。相反,它将其转换为“aetae”。换句话说,它为每个匹配的元素添加一个“a”。甚至“à”也被转换为“aa”。
如果我把第一行改成这个
$string =~ s/(á|à|â|ã)/a/gi;
它可以工作,但是......现在它会在每个匹配的元素(如“eetee”)前面添加一个e。
即使我找到了合适的解决方案,为什么它会这样?
编辑 1:
我添加了“use utf8;”,但它并没有改变行为(尽管它破坏了我在JavaScript/AJAX 中的输出)。
编辑2:
流源自一个 Ajax 请求,由 jQuery 执行。它的来源站点设置为UTF-8。
我正在使用Perl v5.10(perl -v 返回“这是 perl,为 i586-linux-thread-multi 构建的 v5.10.0”)。
【问题讨论】:
-
站点设置的内容会将编码设置为 UTF-8,但它不会告诉 Perl。 Perl 必须在应用字符正则表达式而不是字节正则表达式之前明确地被告知它正在读取 UTF-8。如果您自己从 STDIN 读取输入,则需要按照我的描述设置 binmode。如果您使用的是 CGI.pm,则需要在此处修改选项或在输入上使用 Encode::decode_utf8。如果您正在使用其他获取输入的方式,则需要了解这一点。
-
"使用 utf8;"只告诉源码is in UTF-8,与程序本身的实际运行无关。
标签: regex perl unicode internationalization