簡體   English   中英

如何在Java中替換/刪除UTF-8字符串中的4(+)字節字符?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM