6

最近我在 StringUtils 库中发现了非常有用的方法,它是

StringUtils.stripAccents(String s)

我发现删除任何特殊字符并将其转换为一些 ASCII“等效”非常有帮助,例如 ç=c 等。

现在我正在为一位德国客户工作,他确实需要做这样的事情,但只针对非德语角色。任何变音符号都应保持不变。我意识到在这种情况下 strinAccents 不会有用。

有没有人有这方面的经验?是否有任何有用的工具/库/类或正则表达式?我试图编写一些类来解析和替换这些字符,但是为所有语言构建这样的映射可能非常困难......

任何建议appriciated...

4

3 回答 3

3

最好建一个自定义函数。它可以像下面这样。如果要避免字符的转换,可以去掉两个字符串(常量)之间的关系。

private static final String UNICODE =
        "ÀàÈèÌìÒòÙùÁáÉéÍíÓóÚúÝýÂâÊêÎîÔôÛûŶŷÃãÕõÑñÄäËëÏïÖöÜüŸÿÅåÇçŐőŰű";
private static final String PLAIN_ASCII =
        "AaEeIiOoUuAaEeIiOoUuYyAaEeIiOoUuYyAaOoNnAaEeIiOoUuYyAaCcOoUu";

public static String toAsciiString(String str) {
    if (str == null) {
        return null;
    }
    StringBuilder sb = new StringBuilder();
    for (int index = 0; index < str.length(); index++) {
        char c = str.charAt(index);
        int pos = UNICODE.indexOf(c);
        if (pos > -1)
            sb.append(PLAIN_ASCII.charAt(pos));
        else {
            sb.append(c);
        }
    }
    return sb.toString();
}

public static void main(String[] args) {
    System.out.println(toAsciiString("Höchstalemannisch"));
}
于 2013-08-22T15:30:39.983 回答
2

我的直觉告诉我,最简单的方法就是列出允许的字符并从其他所有内容中去除重音。这就像

import java.util.regex.*;
import java.text.*;

public class Replacement {
    public static void main(String args[]) {
        String from = "aoeåöäìé";
        String result = stripAccentsFromNonGermanCharacters(from);
        
        System.out.println("Result: " + result);
    }

    private static String patternContainingAllValidGermanCharacters =
                                            "a-zA-Z0-9äÄöÖéÉüÜß";
    private static Pattern nonGermanCharactersPattern =
        Pattern.compile("([^" + patternContainingAllValidGermanCharacters + "])");

    public static String stripAccentsFromNonGermanCharacters(
           String from) {
        return stripAccentsFromCharactersMatching(
            from, nonGermanCharactersPattern);
    }

    public static String stripAccentsFromCharactersMatching(
        String target, Pattern myPattern) {

        StringBuffer myStringBuffer = new StringBuffer();
        Matcher myMatcher = myPattern.matcher(target);
        while (myMatcher.find()) {
            myMatcher.appendReplacement(myStringBuffer,
                stripAccents(myMatcher.group(1)));
        }
        myMatcher.appendTail(myStringBuffer);

        return myStringBuffer.toString();
    }


    // pretty much the same thing as StringUtils.stripAccents(String s)
    // used here so I can demonstrate the code without StringUtils dependency
    public static String stripAccents(String text) {
        return Normalizer.normalize(text,
            Normalizer.Form.NFD)
           .replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
    }
}

(我意识到该模式可能不包含所有需要的字符,但添加任何缺少的字符)

于 2013-08-21T07:20:23.667 回答
0

可能会给你一个解决方法。在这里您可以检测语言并仅获取特定文本。

编辑: 您可以将原始字符串作为输入,将语言检测设置为德语,然后它将检测德语字符并丢弃剩余的字符。

于 2013-08-21T07:25:37.397 回答