gpt4 book ai didi

regex - 为什么 Perl 对 Unicode 字符的字符串操作会向字符串添加垃圾?

转载 作者:行者123 更新时间:2023-12-03 15:05:28 26 4
gpt4 key购买 nike

珀尔:

$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;

它可以工作,但是...现在它预先添加了 e到每个匹配的元素(如“eetee”)。

即使我找到了合适的解决方案,为什么它会这样呢?

编辑1:

我添加了“使用 utf8;”,但它没有改变行为(尽管它破坏了我的输出 JavaScript/ AJAX )。

编辑2:

Stream 源自 Ajax 请求,由 jQuery 执行.它源自的站点设置为 UTF-8 .

我正在使用 Perl v5.10 ( perl -v 返回“这是为 i586-linux-thread-multi 构建的 perl,v5.10.0”)。

最佳答案

问题很可能归结为没有

use utf8;

(或与您使用的任何编码系统等效)在您的程序中。你在那里的奇怪替换看起来像字节而不是字符正则表达式替换的问题。
#!/usr/local/bin/perl
use warnings;
use strict;
use utf8;
binmode STDOUT, "utf8";
my $string = "été";

$string =~ s/[áàâã]/a/gi; #This line always prepends an "a"
$string =~ s/[éèêë]/e/gi;
$string =~ s/[úùûü]/u/gi;

print "$string\n";

打印
ete

如果您从文件或标准输入读取输入,请确保将流设置为 utf8 或任何适合编码的内容。对于 STDIN
binmode STDOUT, "utf8";

如果您正在读取文件,请使用
open my $file, "<:utf8", "file_name"

以获得正确的编码。如果不是 UTF-8,请使用 encoding(name)而不是 utf8 .

关于regex - 为什么 Perl 对 Unicode 字符的字符串操作会向字符串添加垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1572101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com