2009-11-04 7 views
21

Ü가 포함 된 문자열이 있다고 가정합니다. 모든 유니 코드 문자를 어떻게 찾을 수 있습니까? 코드를 테스트해야합니까? 내가 어떻게 그럴 수 있니?Java 문자열에서 유니 코드 문자를 어떻게 검색합니까?

예를 들어 "AÜXÜ"이라는 문자열이 있으면 "AYXY"로 변환하고 싶습니다. 나는 다른 유니 코드 문자들에 대해서도 똑같이하고 싶다. 나는 그들을 일종의 번역지도에 저장해야한다.

+3

Ü가지도없이지도에 매핑하는 방법을 어떻게 알 수 있습니까?간단한 매핑이없고 다른 언어로도 매핑이 다를 수 있습니다. – Mark

+0

실제로 문자 하나 하나씩 살펴 봄으로써 할 수 있습니다. 그것은 char의 "range"에 달려 있지만 low level은 조용합니다. 이미이 작업을 수행하기위한 무언가가 있다고 가정합니다. http://en.wikipedia.org/wiki/Unicode을 참조하십시오. – Aif

+0

해결책도 참조하십시오. https://rosettacode.org/wiki/Strip_control_codes_and_extended_characters_from_a_string#Java – Stan

답변

15

"유니 코드 문자"의 정의는 모호하지만 취해야 할 사항은 다음과 같습니다. 표준 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}+", ""); 
} 

한 함정

은 Ü는 당신이 계신 있다면 Y. 모르겠 음, U 될 것입니다. 발음 된 문자로 바꾸려면 매핑을 만들어야합니다. 물론 지루한 작업이지만,이 주제를 따라갈 필요가있는 시간보다 짧은 시간 안에 완료됩니다.

+0

평소에 해낸 방법입니다. 그러나 이렇게하려면 맵에 각 캐릭터를 추가해야합니다. – Geo

+0

특정 문자를 특정 문자로 대체하는 다른 효율적인 옵션은 보이지 않으며 둘 이상의 문자로 대체됩니다. – BalusC

+1

각 문자를지도에 추가하지 않으면 대체 문자를 어떻게 정의합니까? 또는 ASCII가 아닌 모든 문자를 단일 ASCII 문자로 대체 하시겠습니까? –

11

다른 방법으로 돌아가서 문자가 ASCII 문자인지 물어볼 수 있습니다.

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

문자를 char로 분석해야합니다. 그냥 모든 비 ASCII를 교체하려는 경우 -

1

난 당신이 뭘 하려는지 귀하의 예제에서 확실하지 않다 (방법은 유용한 문자 방법의 부하를 포함 commons-lang Charutils에서이다) 0에서 127 범위를 벗어나는 코드 포인트를 찾는 문자열을 반복하여 해당 코드 포인트를 Y로 바꿀 수 있습니다.

12

당신 수 당신의 문자열을 통해 모든 문자 호출

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

코드 포인트를 테스트하는 것이 좋지만, 모든 * 문자를 Y로 대체하려는 인상은 없다. – BalusC

+0

그는 유니 코드 문자를 사용하면 문자 그대로 Y가 아닌 문자가 아닌 문자를 모두 바꾸는 것을 의미한다는 것을 이해할 수 있습니다. – jitter

2

에 대한 루프 그것은 "AÜXÜ"을 "AYXY"를 변환하여 얻은 정확히 나에게 명확하지 않다. 이것은 Ü가 특정 언어에서 Y와 같이 발음되기 때문에입니까? 어떤 언어? 그리고 다른 어떤 규칙들이 적용될 수 있습니까?

용어의 관점에서

...

"a" 

은 상기 유니 코드 문자열이다. 여기에는 단일 UTF-16 인코딩 된 문자가 포함됩니다.

영어 알파벳으로 문자의 범위를 제한하려면 Normalization performed in this answer을보십시오.

+0

대체 예였습니다. 실제로 문자를'_XX_'로 대체합니다 :) – Geo

0

클래스 Character도 몇 가지 흥미로운 방법을 제공합니다. 그것을 한번보세요.

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

Character.UnicodeBlock.of('�') == Character.UnicodeBlock.BASIC_LATIN; //false 
관련 문제