【问题标题】:How to print "zero width non-joiner" using perl如何使用 perl 打印“零宽度非连接符”
【发布时间】:2013-10-27 09:35:17
【问题描述】:

我已经搜索过这个问题,但所有的讨论都是围绕如何从字符串中删除“零宽度非连接符”字符或将其替换为标准空格。所以,我知道如何在给定的字符串中检测和删除它。 现在我的问题是如何在 perl 中打印这个字符串?我知道如何在 Python 和 ruby​​ 中做到这一点,但它在 perl 中不起作用。 在 ruby​​ 中,我过去常常这样做:

mystring.gsub!(/\s+/,'<200c>')

而且效果很好。但是在 Perl 中按照相同的方式,它不起作用。实际上我已经尝试了以下方法,但它没有返回正确的输出:

$mystring =~ s/\s+/\x{200C}/g;

关键是我可以在 Perl 中检测到这个字符,但我不能打印它。关于这个问题的任何想法?

【问题讨论】:

  • 你想要什么输出,你得到什么输出
  • 也许你应该看看perldoc.perl.org/open.html。我试过use open ':encoding(utf8)',它似乎工作。
  • 我输入了一些文本,例如:ab{space}cd,我希望它是:ab{non-joiner space}cd。但我没有在两者之间得到非连接空间。而不是它,我得到双倍空格。

标签: regex string perl bash text


【解决方案1】:

为了正确写入包含 utf8 序列的字符串,您应该在该流上使用 binmode()。我建议您尝试的是binmode( STDOUT, ':utf8' );,然后打印字符串。 length( $mystring ) 函数可以帮助您判断字符串是否包含比可见字符更多的字符并验证替换是否成功。

【讨论】:

  • 我没有得到正确的长度,即使是原始文本。可能是因为我的字符串是波斯字符,而不是英文。
  • 奇怪的是,如果我想用其他字符(比如 X)替换空格,它可以完美地工作。我对此没有任何问题。问题在于非连接空间。
  • 目前我正在使用 (use encoding "utf8";) 和 (open STDOUT, "<:encoding utf-8 stdout>
  • 你能提供一个示例字符串和你的 perl 发行版的版本号吗?
  • 我的perl版本是:v5.10.1
猜你喜欢
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2018-10-02
  • 2014-12-12
  • 2012-01-17
相关资源
最近更新 更多