foreach 루프 ( ref ) 와 함께 작동하는 해결 방법을 추가하고 Java 8 로 이동할 때 Java 8의 새로운 String # codePoints 메서드로 쉽게 변환 할 수 있다고 생각했습니다 .
다음과 같이 foreach와 함께 사용할 수 있습니다.
for(int codePoint : codePoints(myString)) {
....
}
다음은 도우미 mthod입니다.
public static Iterable<Integer> codePoints(final String string) {
return new Iterable<Integer>() {
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
int nextIndex = 0;
public boolean hasNext() {
return nextIndex < string.length();
}
public Integer next() {
int result = string.codePointAt(nextIndex);
nextIndex += Character.charCount(result);
return result;
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}
또는 문자열을 int 배열로 변환하려는 경우 (위의 접근 방식보다 더 많은 RAM을 사용할 수 있음) :
public static List<Integer> stringToCodePoints(String in) {
if( in == null)
throw new NullPointerException("got null");
List<Integer> out = new ArrayList<Integer>();
final int length = in.length();
for (int offset = 0; offset < length; ) {
final int codepoint = in.codePointAt(offset);
out.add(codepoint);
offset += Character.charCount(codepoint);
}
return out;
}
고맙게도 "codePoints"를 사용하여 UTF-16 (자바의 내부 문자열 표현)의 대리 쌍을 안전하게 처리합니다.