【问题标题】:Remove accents from accented characters [duplicate]从重音字符中删除重音[重复]
【发布时间】:2013-07-07 20:43:07
【问题描述】:

我正在寻求建议,我应该使用什么库和/或函数将国际文本转换为它的英文字符替代。

例如

Vous avez aimé l'épée offerte par les elfes à Frodon 

转换成

Vous avez aime l'epee offerte par les elfes a Frodon 

【问题讨论】:

  • @Janos - 我现在正在使用unidecode,但我得到了错误的结果。例如 Etüde 出于某种原因转换为 EtA1_4de
  • 我明白你的意思。你应该在你的问题中添加它。顺便说一句,我无法重现您的问题,unidecode 确实对我有用。
  • @Ωmega,你做了unidecode(encode_utf8("Et\N{LATIN SMALL LETTER U WITH DIAERESIS}de")) 而不是unidecode("Et\N{LATIN SMALL LETTER U WITH DIAERESIS}de")
  • 试图删除重音几乎总是错误的做法。我猜你想:How to match string with diacritic in perl?
  • @ikegami - 我不使用encode_utf8,但它可能已经编码。我应该在使用unidecode 之前以某种方式对其进行解码吗?

标签: perl


【解决方案1】:

首先您可以使用Unicode::Normalize 分解字符,然后您可以使用简单的正则表达式删除所有变音符号。 (我认为只需抓住所有非间距标记字符就可以了,但可能有一两个不明显的例外。)

这是一个例子:

use strict;
use warnings;
use utf8;

use Unicode::Normalize;

my $test = "Vous avez aimé l'épée offerte par les elfes à Frodon";

my $decomposed = NFKD( $test );
$decomposed =~ s/\p{NonspacingMark}//g;

print $decomposed;

输出:

Vous avez aime l'epee offerte par les elfes a Frodon

【讨论】:

  • Etüde >> EtA1_4de :-/
  • 有趣,从未想过NonspacingMark。通常的方法是“字典攻击”……这不是假设所有这些字符都是组合的吗?也许我需要看看NFKD 做了什么。
  • @Ωmega,我没有得到 Etüde 的结果。你是 encodeing 你的输出吗?
  • @Ωmega,你也改变了一些东西,因为你传递了Etüde而不是Etüde的UTF-8。
  • 字符串末尾多了一个“%”。
猜你喜欢
  • 1970-01-01
  • 2014-06-04
  • 2012-01-31
  • 2018-08-27
  • 2014-06-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
相关资源
最近更新 更多