gpt4 book ai didi

perl - 使用 Perl 玩转 Unicode

转载 作者:行者123 更新时间:2023-12-02 22:02:45 26 4
gpt4 key购买 nike

我有一个我认为微不足道的问题。我必须处理德语字母表中的元音变音 (äöü)。在Unicode中,似乎有几种显示它们的方法,其中之一就是组合字符。我需要规范化这些不同的方式,将它们全部替换为单字符代码。

这样一个异常的元音变音很容易找到:它是一个字母aou,后面跟着UTF-8字符\uCC88。所以我认为正则表达式就足够了。

这是我的转换函数,使用 Encoding包。

# This sub can be extended to include more conversions
sub convert {
local $_;
$_ = shift;

$_ = encode( "utf-8", $_ );

s/u\xcc\x88/ü/g;
s/a\xcc\x88/ä/g;
s/o\xcc\x88/ö/g;
s/U\xcc\x88/Ü/g;
s/A\xcc\x88/Ä/g;
s/O\xcc\x88/Ö/g;

return $_;
}

但是打印出来的元音变音是一些更狡猾的字符(现在占用 4 个字节),而不是这个 list 上的字符。 .

我猜问题是 Perl 的内部格式、实际的 UTF-8 和这种编码格式的杂耍。

甚至将替换行更改为

s/u\xcc\x88/\xc3\xbc/g;
s/a\xcc\x88/\xc3\xa4/g;
s/o\xcc\x88/\xc3\xb6/g;
s/U\xcc\x88/\xc3\x9c/g;
s/A\xcc\x88/\xc3\x84/g;
s/O\xcc\x88/\xc3\x96/g;

没有帮助,它们被正确转换,但后面跟着字节中的“\xC2\xA4”。

有什么帮助吗?

最佳答案

你做错了:你必须停止在表示级别上弄乱字符的习惯,即在处理文本而不是二进制数据时不要弄乱正则表达式中的字节。

第一步是了解encoding in Perl的主题。您需要它来理解我将在下一段中使用的术语“字符串”。

当您有字符串时,它可能处于组合(分解)的各种状态中的任何一种。使用模块Unicode::Normalize更改字符串,并阅读 Unicode 规范中有关等效和规范化的相关章节以了解详细信息,它们位于该模块文档的底部。

我猜您想要 NFC,但您必须对数据进行健全性检查,看看这是否真的是预期的结果。

use charnames qw(:full);
use Unicode::Normalize qw(NFC);
my $original_character_string = "In des Waldes tiefsten Gr\N{LATIN SMALL LETTER U WITH DIAERESIS}nden ist kein R\N{LATIN SMALL LETTER A}\N{COMBINING DIAERESIS}uber mehr zu finden.";
my $modified_character_string = NFC($original_character_string);
# "In des Waldes tiefsten Gr\x{fc}nden ist kein R\x{e4}uber mehr zu finden."

关于perl - 使用 Perl 玩转 Unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8242615/

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