【问题标题】:How to replace � with & in perl?如何在 perl 中用 & 替换 �?
【发布时间】:2016-08-03 06:56:18
【问题描述】:

我有一个外部窗口应用程序调用 PERL 脚本,其字符串包含 �。我正在尝试检测每个这样的实例并将其替换为 &。

我尝试使用所有这些但没有任何效果:

$line =~ s/\uFFFD/&/g;
$line =~ s/&#65533/&/g;
$line =~ s/\x{fffd}/&/g;
$line =~ s/\xfffd/&/g;

【问题讨论】:

  • 请提供use Data::Dumper; { local $Data::Dumper::Useqq = 1; warn(Dumper($str)); }的输出
  • 如果你有字符 FFFD,第三个就可以了。
  • @Pedro Lobito,该字符用于表示无效的内容。在你的源代码中加入一些无效的东西是一个糟糕的选择。
  • @ikegami ,我明白这一点,但我无法在 Windows 应用程序中更改任何内容。
  • 我使用了 Data::Dumper,作为字符串的一部分,我得到了这个 \\302\\201。所以如果我应用“s/\x81/&/g”,我会得到“�&”。我该如何摆脱那个 � 或 \\302?

标签: regex perl


【解决方案1】:

正如 ikegami 在他们的评论中指出的那样,第三种解决方案 ($line =~ s/\x{fffd}/&/g;) 是正确的解决方案。如果它不起作用,那么您的假设之​​一肯定是错误的。我想到了两种可能性:

  • 您的输入不包含实际的Unicode replacement character。您的编辑器可能会以相同的方式呈现另一个字节序列。您可以通过运行hexdump -c 来检查它。如果您的输入以 UTF-8 编码(注意 UTF8 和 Unicode 之间的区别),您应该会看到以下序列:357 277 275
  • 您没有告知 perl 有关输入文本编码的信息。 Perl 假定它是单字节编码,因此包含多字节字符的正则表达式永远不会匹配。请比较以下:

    回显'�' | perl -pe 's/\x{fffd}/&/'

    回显'�' | perl -CS -pe 's/\x{fffd}/&/'

    &

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多