[英]How to replace/remove 4(+)-byte characters from a UTF-8 string in Java?
因為MySQL 5.1不支持4字節UTF-8序列,所以我需要替換/刪除這些字符串中的4字節序列。
我正在尋找一種干凈的方法來替換這些角色。
在這種情況下,Apache庫正在用問號替換字符,但是當然,ASCII等價物會更好。
NB輸入來自外部源(電子郵件名稱),此時升級數據庫不是解決方案。
我們最終在Java中為此問題實現了以下方法。 Basicaly用更高的代碼點替換字符,然后用最后的3字節UTF-8字符替換。
偏移量計算是為了確保我們保持unicode代碼點。
public static final String LAST_3_BYTE_UTF_CHAR = "\uFFFF";
public static final String REPLACEMENT_CHAR = "\uFFFD";
public static String toValid3ByteUTF8String(String s) {
final int length = s.length();
StringBuilder b = new StringBuilder(length);
for (int offset = 0; offset < length; ) {
final int codepoint = s.codePointAt(offset);
// do something with the codepoint
if (codepoint > CharUtils.LAST_3_BYTE_UTF_CHAR.codePointAt(0)) {
b.append(CharUtils.REPLACEMENT_CHAR);
} else {
if (Character.isValidCodePoint(codepoint)) {
b.appendCodePoint(codepoint);
} else {
b.append(CharUtils.REPLACEMENT_CHAR);
}
}
offset += Character.charCount(codepoint);
}
return b.toString();
}
另一個簡單的解決方案是使用正則表達式[^\ -\]
。 例如在java中:
text.replaceAll("[^\\u0000-\\uFFFF]", "\uFFFD");
5字節utf-8序列以111110xx字節開頭,6字節utf-8序列以1111110x字節開頭。 需要注意的是,沒有1-4字節utf-8序列的后續字節包含大的字節,因為后續字節總是10xxxxxx的形式。
因此,你只需要查看字節,每次看到一個111110xx的字節,然后只發出'?' 輸出流/數組,同時從輸入跳過接下來的4個字節; 6字節序列的模擬。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.