如何检测Java字符串中的unicode字符?

时间:2009-11-04 12:40:20

标签: java string unicode

假设我有一个包含Ü的字符串。我怎么能找到所有那些unicode字符?我应该测试他们的代码吗?我该怎么做?

例如,给定字符串“AÜXÜ”,我想将其转换为“AYXY”。我想对其他unicode角色做同样的事情,我不想将它们存储在某种翻译地图中。

6 个答案:

答案 0 :(得分:15)

“unicode characters”的定义含糊不清,但将被视为标准ISO 8859 charset未涵盖的UTF-8字符。如果在您的情况下这是真的,则循环遍历String中的所有字符并测试其代码点以确定它是否在给定的字符集内。

或者,使用Map<Character, Character>和地图中包含与键匹配的字符。例如:

Map<Character, Character> charReplacementMap = new HashMap<Character, Character>() {{
    put('Ü', 'Y');
    // Put more here.
}};

String originalString = "AÜAÜ";
StringBuilder builder = new StringBuilder();

for (char currentChar : originalString.toCharArray()) {
    Character replacementChar = charReplacementMap.get(currentChar);
    builder.append(replacementChar != null ? replacementChar : currentChar);
}

String newString = builder.toString();

或者,你的意思是“所有带有变音符号的人物”?如果是,请使用java.text.Normalizer删除变音标记:

/**
 * Remove any diacritical marks (accents like ç, ñ, é, etc) from
 * the given string (so that it returns plain c, n, e, etc).
 * @param string The string to remove diacritical marks from.
 * @return The string with removed diacritical marks, if any.
 */
public static String removeDiacriticalMarks(String string) {
    return Normalizer.normalize(string, Form.NFD)
        .replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}

一个陷阱,Ü将成为U,而不是Y.不确定这是否是你所追求的。如果你想用发音字符替换,你真的需要创建一个映射。当然,这是一项繁琐的工作,但它的完成时间比你需要的时间少。

答案 1 :(得分:13)

你可以遍历你的字符串和每个字符调用

If (Character.UnicodeBlock.of(c) != Character.UnicodeBlock.BASIC_LATIN) {
 // replace with Y
}

答案 2 :(得分:12)

你可以反过来询问角色是否是ascii角色。

public static boolean isAscii(char ch) {
    return ch < 128;
}

当然,您必须通过char分析字符串char。

(该方法来自commons-lang CharUtils,其中包含大量有用的Character方法)

答案 3 :(得分:2)

我不清楚将“AÜXÜ”转变为“AYXY”所获得的确切成果。这是因为Ü在特定语言中的发音如Y吗?什么语言?还有什么其他规则可以适用?


就术语而言......

"a"

以上是Unicode字符串。它包含一个UTF-16编码字符。

如果您希望将字符范围限制为英文字母,请查看Normalization performed in this answer

答案 4 :(得分:1)

我不确定你的例子你想要做什么 - 如果你只是试图用Y替换所有非ASCII值,那么你可以遍历字符串寻找范围0之外的代码点到127,并用Y替换那些代码点。

答案 5 :(得分:0)

班级Character也提供了一些有趣的方法。看看吧。

Character.UnicodeBlock.of('a') == Character.UnicodeBlock.BASIC_LATIN; //true

Character.UnicodeBlock.of('�') == Character.UnicodeBlock.BASIC_LATIN; //false