【问题标题】:In a perl string, how can I replace a unicode em dash with 2 ascii hyphens?在 perl 字符串中,如何用 2 个 ascii 连字符替换 unicode 破折号?
【发布时间】:2016-06-20 13:23:22
【问题描述】:

我首先只是尝试使用以下方法在一行中找到它:

    $w = index($line, "\x{2014}");

我没有遇到语法错误,但 $w 从未 >= 0。

我试过了:

    $line =~ s/\x{2014}/--/g;

这也不起作用,即:没有进行任何更改。

进行交换的最简单方法是什么?

如果这在之前的帖子中有解释,我没看到。

【问题讨论】:

  • 检查输入的编码。例如,如果是 UTF-8 编码,则 em-dash 将匹配 \x{e2}\x{80}\x{94}
  • 好!这适用于索引调用,但不适用于正则表达式。但这将完成工作。遗憾的是,文档没有说明必须将十六进制分解为 3 个单独的字符。
  • $line =~ s/\x{2014}/--/g; 确实有效,这意味着 $line 不包含破折号。也许它包含 em dash 的 UTF-8 编码?解码输入,编码输出!

标签: perl unicode


【解决方案1】:

为我工作:

#!/bin/perl -w

use feature 'unicode_strings';
use utf8;

$line = "first — and second";
$line =~ s/\x{2014}/--/g;
print("$line\n");
# => first -- and second

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2011-02-11
    • 2014-12-03
    • 2018-07-02
    相关资源
    最近更新 更多