2009-11-04 64 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