2009-11-04 66 views
21

假设我有一个包含Ü的字符串。我将如何找到所有这些unicode字符?我应该测试他们的代码吗?我会怎么做?如何检测Java字符串中的unicode字符?

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

+3

你怎么知道Ü将映射到没有你自己的地图?没有简单的映射,我怀疑在不同的语言中,任何映射都可能不同 – Mark 2009-11-04 12:44:25

+0

实际上,您可以通过逐个查看字符来实现。它取决于字符的“范围”,但它的安静程度很低,我假设已经有一些东西可以实现这个任务。 请参阅http://en.wikipedia.org/wiki/Unicode – Aif 2009-11-04 12:45:17

+0

另请参阅此处的解决方案:https://rosettacode.org/wiki/Strip_control_codes_and_extended_characters_from_a_string#Java – Stan 2016-11-11 11:50:27

回答

15

“unicode characters”的定义含糊不清,但会被带到表示标准ISO 8859 charset未涵盖的UTF-8字符。如果在你的情况下这是真的,那么循环遍历字符串中的所有字符并测试它的代码点以确定它是否在给定字符集内。

或者,使用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将成为U,不Y.不知道如果这就是你追求的。如果你想用明显的字符替换,你真的需要创建一个映射。当然,这是一项单调乏味的工作,但所需时间比您需要的时间更短。

+0

这就是我通常所做的。但是这需要你在地图上添加每个字符。 – Geo 2009-11-04 12:49:44

+0

我没有看到任何其他有效的选项来替换某个字符和某个字符以及多个字符。 – BalusC 2009-11-04 12:52:30

+1

如果您没有将每个角色添加到地图中,那么您如何定义替换?或者你想要所有的非ASCII字符替换为一个ASCII字符? – 2009-11-04 12:52:39

11

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

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

你必须分析char字符串然后当然。

(该方法是从commons-lang Charutils包含有用的字符方法负载)

1

我不知道从你比如说你正在试图做什么 - 如果你只是想取代所有非ASCII值,然后你可以遍历字符串寻找范围0到127之外的代码点,并用Y代替它们那些代码点。

12

,你可以通过你的字符串,并为每一个字符呼叫

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

好的测试代码点,但我不觉得他想用Y代替*每个*字符。 – BalusC 2009-11-04 12:50:47

+0

他说unicode字符我明白,他可能意味着用Y替换所有非ascii字符。无论 – jitter 2009-11-04 12:53:46

2

循环目前还不清楚我到底是什么通过将“AÜXÜ”到“AYXY”获得。这是因为Ü在特定语言中被发音为Y吗?什么语言?还有哪些其他规则可能适用?


在术语方面...

"a" 

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

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

+0

这只是一个替代的例子。我实际上会用'_XX_'替换字符:) – Geo 2009-11-04 12:53:45

0

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

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

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