【问题标题】:Easy way to remove accents from a Unicode string? [duplicate]从 Unicode 字符串中删除重音的简单方法? [复制]
【发布时间】:2013-02-17 21:32:33
【问题描述】:

我想改一下这句话:

Et ça sera sa moitié。

收件人:

Et ca sera sa moitie.

有没有一种简单的方法可以在 Java 中做到这一点,就像我在 Objective-C 中所做的那样?

NSString *str = @"Et ça sera sa moitié.";
NSData *data = [str dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *newStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

【问题讨论】:

  • 这与 UTF-8 或任何其他字符编码无关。

标签: java string unicode diacritics


【解决方案1】:

最后,我使用Normalizer 类解决了这个问题。

import java.text.Normalizer;

public static String stripAccents(String s) 
{
    s = Normalizer.normalize(s, Normalizer.Form.NFD);
    s = s.replaceAll("[\\p{InCombiningDiacriticalMarks}]", "");
    return s;
}

【讨论】:

  • 这是删除字符,还是将带重音的字符替换为没有重音的等价物?我问,因为这个:replaceAll("[^\\p{ASCII}]", "") 看起来像是什么都没有替换(删除)。
  • 你说得对,我只是编辑了我的答案(目的当然是替换而不是删除字符)。
  • 为了正确转换一些字符串,我使用了Form.NFKD(“兼容性分解”)
  • 我用它来规范化文件名。
  • @ykatchou 你指的是“com.ibm.icu.text.Normalizer”,但答案是关于“java.text.Normalizer”
【解决方案2】:

也许最简单和最安全的方法是使用来自Apache Commons LangStringUtils

StringUtils.stripAccents(String input)

从字符串中删除变音符号(~= 重音符号)。案子不会 改变。例如,“à”将被“a”替换。注意 连字将保持原样。

StringUtils.stripAccents()

【讨论】:

  • 请注意,它是 Apache Commons Lang3,而不是 Commons Lang
  • 这很好,但不适用于“Ø”。
  • 所选答案不会从字符串中消除波兰语łŁ,这个可以。
【解决方案3】:

我想唯一的区别是与解决方案相比,我使用的是+ 而不是[]。我认为两者都有效,但最好在这里也有它。

String normalized = Normalizer.normalize(input, Normalizer.Form.NFD);
String accentRemoved = normalized.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");

【讨论】:

    【解决方案4】:

    对于科特林

    fun stripAccents(s: String): String 
    {
        var string = Normalizer.normalize(s, Normalizer.Form.NFD)
        string = Regex("\\p{InCombiningDiacriticalMarks}+").replace(string, "")
        return  string
    }
    

    【讨论】:

    • 不错,但如果有String的扩展功能会更好
    【解决方案5】:

    假设您使用的是 Java 6 或更高版本,您可能需要查看 Normalizer,它可以分解重音,然后使用正则表达式去除组合重音。

    否则,您应该能够使用ICU4J 获得相同的结果。

    【讨论】:

      【解决方案6】:

      谢谢

      public static final Pattern DIACRITICS_AND_FRIENDS = Pattern.compile(
                                    "[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+");
      
      private static String stripDiacritics(String str) {
          str = Normalizer.normalize(str, Normalizer.Form.NFD);
          str = DIACRITICS_AND_FRIENDS.matcher(str).replaceAll("");
          return str;
      }
      

      => stripDiacritics("Et Ça sera sa moitié." );

      【讨论】:

        猜你喜欢
        • 2012-06-11
        • 2013-11-25
        • 2012-11-27
        • 2021-08-13
        • 2014-06-04
        • 2013-08-20
        • 2013-08-12
        • 2018-08-27
        • 2013-07-07
        相关资源
        最近更新 更多