如何在java字符串中检测unicode字符?

6yjfywim  于 2021-06-30  发布在  Java
关注(0)|答案(6)|浏览(397)

假设我有一个包含ü. 我如何找到所有这些unicode字符?我应该测试他们的代码吗?我该怎么做?
例如,给定字符串“aü十ü", 我想把它改成“ayxy”。我想对其他unicode字符也这样做,我不想把它们存储在某种翻译Map中。

ou6hu8tu

ou6hu8tu1#

你可以循环你的字符串和每个字符的调用

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

hmae6n7t2#

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

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

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

guicsvcw3#

我不清楚转化“a”究竟能得到什么ü十ü" 到“ayxy”。这是因为ü 在一种特定的语言中发音像y吗?什么语言?还有什么其他规则可以适用?
在术语方面。。。

"a"

上面是一个unicode字符串。它包含一个utf-16编码字符。
如果您希望将字符范围限制为英语字母,请查看此答案中执行的规范化。

monwx1rj

monwx1rj4#

“unicode字符”的定义很模糊,但将被视为标准iso 8859字符集未涵盖的utf-8字符。如果在您的例子中是这样,则循环遍历字符串中的所有字符,并测试其代码点以确定它是否在给定的字符集中。
或者,使用 Map<Character, Character> 以及Map中包含匹配键的字符。例如:

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。不知道你是不是在找这个。如果要用发音字符替换,则确实需要创建Map。当然,这是一个乏味的工作,但它做的时间比你需要遵循这个主题。

sauutmhj

sauutmhj5#

你可以反过来问这个字符是不是ascii字符。

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

当然,你必须逐个分析字符串。
(该方法来自commons lang charutils,其中包含大量有用的字符方法)

qcuzuvrc

qcuzuvrc6#

从您的示例中,我不确定您要做什么-如果您只是尝试用y替换所有非ascii值,那么您可以在字符串中循环查找0到127范围之外的代码点,并用y替换这些代码点。

相关问题