unicode编码转换工具(中文汉字与unicode编码转换工具)

科技资讯 娇娇 2023-01-13 15:22:57 31次浏览 0个评论 扫描二维码

我先考一考你,你说这个字符串(ab 一 2?仯 3?4)有多少个字符?

这时候你也许开始数了,123…9 个,没错,确实我们肉眼确实是看到了 9 个,java 代码如下:

unicode 编码转换工具(中文汉字与 unicode 编码转换工具)(1)

有没有发现 java 判断出来的不是 9,而是 12!!!

那是因为这个字符串中有 2 个字符 ab 一 2?仯 3?4 用黄色表示,实际上 UTF-8 已经满足不了,? 见下图:

unicode 编码转换工具(中文汉字与 unicode 编码转换工具)(2)

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 编码转换工具(中文汉字与 unicode 编码转换工具)(3)

进入主题

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();
}

不思进取 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:unicode编码转换工具(中文汉字与unicode编码转换工具)
喜欢 (0)
[]
分享 (0)

您必须 登录 才能发表评论!