我在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"" “тест""
的?
答案 0 :(得分: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"" “тест""