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

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

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

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

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

 Map charReplacementMap = new HashMap() {{ 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.不确定这是否是你所追求的。 如果你想用发音字符替换,你真的需要创建一个映射。 当然,这是一项繁琐的工作,但它的完成时间比您需要的时间少。

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

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

你可以反过来问问这个角色是不是ascii角色。

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

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

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

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


在术语方面……

 "a" 

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

如果您希望将字符范围限制为英文字母,请查看此答案中执行的标准化 。

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

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

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