區位碼轉國標碼工具「國際碼和內碼的轉換在線」

我先考一考你,你說這個字符串(ab一2?仯3?4)有多少個字符?

這時候你也許開始數了,123…9個,沒錯,確實我們肉眼確實是看到了9個,java代碼如下:

漢字,中文,內碼互轉,unicode編碼轉換,漢字機內碼轉換

有沒有發現java判斷出來的不是9,而是12!!!

那是因為這個字符串中有2個字符ab一2?仯3?4用黃色表示,實際上UTF-8已經滿足不了,? 見下圖:

漢字,中文,內碼互轉,unicode編碼轉換,漢字機內碼轉換

java的String是使用UTF-16來表示的,U+0000-U+FFFF都ok,但是只要是下列這個區間的字符都無法用常規手段處理,5位內碼的,用length都無法正確判斷其長度

CJK Unified Ideographs Extension B (U+20000 through U+2A6DD)
CJK Unified Ideographs Extension C (U+2A700 through U+2B734)
CJK Unified Ideographs Extension D (U+2B740 through U+2B81D)
CJK Unified Ideographs Extension E (U+2B820 through U+2CEA1)
CJK Unified Ideographs Extension F (U+2CEB0 through U+2EBE0)

具體也可以查看官方資料 ,了解unicode,UTF-8,UTF-16,UTF-32的區別。

如下圖,可以通過Character中的codePointCount來得到字符數量。

漢字,中文,內碼互轉,unicode編碼轉換,漢字機內碼轉換

進入主題

jdk自帶的Character類特別好用,漢字轉內碼,內碼轉漢字具體功能請參考下面的代碼

/**
 * 字符串轉16進制內碼
 * @param str ab一2?仯3?4
 * @return \u61\u62\u4e00\u32\u2b802\u4eef\u33\u2b82f\u34\u34
 */
public static String stringToCodePoints(String str) {
    StringBuilder stringBuilder = new StringBuilder();
    str.codePoints().forEach(cp -> stringBuilder.append("\u").append(Integer.toHexString(cp)));
    return stringBuilder.toString();
}

/**
 * 內碼轉漢字
 * @param codePoints \u61\u62\u4e00\u32\u2b802\u4eef\u33\u2b82f\u34\u34
 * @return ab一2?仯3?4
 */
public static String codePointsToString(String codePoints) {
    StringBuilder stringBuilder = new StringBuilder();
    for(String hexCodePoint : codePoints.split("\\u")){
        if(StringUtils.isNotBlank(hexCodePoint)) {
            stringBuilder.append(codePointToString(Integer.parseInt(hexCodePoint, 16)));
        }
    }
    return stringBuilder.toString();
}

/**
 * 十進制轉漢字
 * @param cp code point 漢字內碼
 * @return
 */
public static String codePointToString(int cp) {
    StringBuilder sb = new StringBuilder();
    if (Character.isBmpCodePoint(cp)) {
        sb.append((char) cp);
    } else if (Character.isValidCodePoint(cp)) {
        sb.append(Character.highSurrogate(cp));
        sb.append(Character.lowSurrogate(cp));
    } else {
        sb.append('?');
    }
    return sb.toString();
}

支持5位編碼的在線轉換工具

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/274174.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-17 14:11
下一篇 2024-12-17 14:11

相關推薦

發表回復

登錄後才能評論