【问题标题】:Perl in-place editing messes up text encodingPerl 就地编辑搞乱了文本编码
【发布时间】:2014-03-13 12:52:33
【问题描述】:

输入内容是从webkit窗口复制的一段html,比如

它在使用 UTF-8 的 web-kit 中正确显示。

我要做的是替换所有标签,我使用这个单行:

perl -i -pe "s/<img.+?>//g"

输入是我复制到剪贴板并被另一个程序重定向到这个单行的富文本,可能是这样的:

echo "rich html text" | perl -i -pe "s/<img.+?>//g"

好吧,它确实删除了 &lt;img&gt; 标记,但所有 Unicode 字符在替换后都会损坏。

我使用的是 Windows 7,语言环境 En - 美国。 cmd 代码页已设置为 UTF-8。 即使我通过-C 选项,它也不起作用。

有没有办法让代码保持单行,同时使其适用于 Unicode 输入?

【问题讨论】:

标签: regex perl


【解决方案1】:

你可以尝试在你的 perl one liner 中插入这个:

use open ":encoding(utf8)";

你可能可以通过 -M 添加它:

perl -Mopen=:encoding(utf8) -i -pe "s/<img.+?>//g"

(感谢@TLP 提醒我语法)。

另见the open pragma

【讨论】:

  • 该行的切换语法为-Mopen=:encoding(utf8)
  • 我忘了说,输入不是文件,它是我复制到剪贴板并由另一个程序通过管道传输到此单行器的文本。我试过这个perl -i -pe "use open ':encoding(utf8)'; s/&lt;img.+?&gt;//g",它甚至不做替换,我不知道哪里错了。 :(
【解决方案2】:

perl -COE -i -pe "s/&lt;img.+?&gt;//g" input 应该可以工作,-COE 选项会在 STDIN 和 STDOUT 上打开 unicode。

更多详情请见perldoc perlrun

【讨论】:

  • 它不起作用,我尝试了所有 -C 选项。没有区别。
  • 甚至-CD?我意识到您不是在处理 STDIN/STDOUT,而是在处理文件。
猜你喜欢
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
相关资源
最近更新 更多