Op De Cirkel이 대부분 옳습니다. 그의 제안은 대부분의 경우 작동합니다.
myString.replaceAll("\\p{C}", "?");
그러나 myString
비 BMP 코드 포인트가 포함될 수 있다면 더 복잡합니다. \p{C}
의 대리 코드 포인트를 포함합니다 \p{Cs}
. 위의 대체 방법은 때때로 서로 게이트 쌍의 절반 만 대체하여 비 BMP 코드 포인트를 손상시킵니다. 의도 된 동작이 아닌 Java 버그 일 수 있습니다.
다른 구성 범주를 사용하는 것은 옵션입니다.
myString.replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "?");
그러나 쌍의 일부가 아닌 단독 대리 문자 (각 대리 문자에 할당 된 코드 포인트가 있음)는 제거되지 않습니다. 정규식이 아닌 접근 방식은 내가 올바르게 처리하는 유일한 방법입니다 \p{C}
.
StringBuilder newString = new StringBuilder(myString.length());
for (int offset = 0; offset < myString.length();)
{
int codePoint = myString.codePointAt(offset);
offset += Character.charCount(codePoint);
switch (Character.getType(codePoint))
{
case Character.CONTROL:
case Character.FORMAT:
case Character.PRIVATE_USE:
case Character.SURROGATE:
case Character.UNASSIGNED:
newString.append('?');
break;
default:
newString.append(Character.toChars(codePoint));
break;
}
}