perl中支持Unicode的字边界

问题描述 投票:0回答:1

我在perl-5.24上,偶然发现\b不是unicode意识到的:

$ echo '""test"" ""тест""' | perl -pe 's/""\b/“/g'
“test"" ""тест""

在哪里我预计它将是“test"" “тест""

然后我了解了perl-5.22.1正则表达式中的unicode扩展,特别是这个:\b{wb}。但是通过这些扩展我仍然得到错误的结果:

$ echo '""test"" ""тест""' | perl -pe 's/""\b{wb}/“/g'
“test“ “тест“

在哪里我预计它将是“test"" “тест""

我的问题是:我通过perl正则表达式将""test"" ""тест""转换为“test"" “тест""

regex perl unicode
1个回答
6
投票

你告诉s///与以下内容相符:

22.22.74.65.73.74.22.22.20.22.22.D1.82.D0.B5.D1.81.D1.82.22.22.A

s///(或更具体地说,\b),需要Unicode代码点,这意味着以上内容被视为

""test"" ""Ñ<82>еÑ<81>Ñ<82>""

这显然不是你想要的字符串。


同样,您声称您的代码包含以下内容:

s/""\b/“/g

Perl希望使用ASCII编码脚本​​,除非您使用UTF-8对脚本进行编码并添加use utf8;以便让它知道。


解码输入。编码输出。

$ echo '""test"" ""тест""' | perl -pe'
    use utf8;
    use open ":std", ":encoding(UTF-8)";
    s/""\b/“/g
'
“test"" “тест""

要么

$ echo '""test"" ""тест""' | perl -CSDA -Mutf8 -pe's/""\b/“/g'
“test"" “тест""
© www.soinside.com 2019 - 2024. All rights reserved.