Java实现Unicode加码和解码的工具类

写代码的时候经常会用到unicode编码和解码,这里记录一下unicode的工具类。
其实unicode编码和解码,就是16进制数字和char之间的来回转换。
先看一下工具类:

package com.test.test.util;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

public class UnicodeUtils {

    // 16进制数组
    private static final char[] HEX_CHAR_ARRAY = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'a', 'b', 'c', 'd', 'e', 'f'};
    
    // unicode开始标记
    private static final String UNICODE_START = "\\u";
    
    // 十六进制常量
    private static final int HEX_NUMBER = 16;

    //解码
    public static String decode(String unicodeString) {
        if (StringUtils.isBlank(unicodeString) || !unicodeString.contains(UNICODE_START)) {
            return null;
        }
        StringBuilder stringBuilder = new StringBuilder();
        int index, pos = 0;
        while (true) {
            index = unicodeString.indexOf(UNICODE_START, pos);
            if (index == -1) {
                break;
            }
            for (int i = 3; i < 7; i++) {
                if (i == 6 || index + i >= unicodeString.length()) {
                    stringBuilder.append((char) Integer.parseInt(unicodeString.substring(index + 2, index + i), HEX_NUMBER));
                    pos = index + i;
                    break;
                }
                char nextChar = unicodeString.charAt(index + i);
                if (!ArrayUtils.contains(HEX_CHAR_ARRAY, nextChar)) {
                    stringBuilder.append((char) Integer.parseInt(unicodeString.substring(index + 2, index + i), HEX_NUMBER));
                    pos = index + i;
                    break;
                }
            }
        }
        return stringBuilder.toString();
    }

    public static String encode(String string) {
        if (StringUtils.isBlank(string)) {
            return null;
        }
        StringBuilder unicodeBuilder = new StringBuilder();
        for (int i = 0; i < string.length(); i++) {
            char nextChar = string.charAt(i);
            unicodeBuilder.append("\\u");
            unicodeBuilder.append(Integer.toHexString(nextChar));
        }
        return unicodeBuilder.toString();
    }
}

解码的工具方法可能写得有点复杂,是为了兼容符号的unicode码,比如’<'转换之后是\u3c,如果按汉字的固定位数去解码就会有问题。
如果你有更简洁或者更好用的工具类,欢迎把链接贴到评论区。
其实核心的代码就一两行,如下:

// 编码
String unicodeString = "\\u" + Integer.toHexString('异');
// 解码(\u5f02)
char oneChar = (char) Integer.parseInt("5f02", HEX_NUMBER)

喜欢本文的朋友不要忘记点一个免费的赞哦,你的赞将是我最大的动力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Counter-Strike大牛

创作不易,感谢鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值