中文与unicode转换

用途:

国际化配置时,需要将中文转换成对应的unicode编码;比如
1000=memberId不能为空,转换成 1000=memberId\u4e0d\u80fd\u4e3a\u7a7a

代码:

import java.io.*;
import java.net.URISyntaxException;
import java.net.URL;

/**
 * 国际化文件翻译处理
 *
 * @author wael@yunio.com
 * @date 2021/7/12
 */
public class Util {


    public static void main(String[] args) throws IOException, URISyntaxException {
        String originFilePath = "../classes/i18n/message.properties";
        encode(originFilePath );
        String testFilePath = "../classes/i18n/message_zh_CN.properties";
        decode(testFilePath );
    }

    /**
     * 将汉字转为unicode
     *
     * @param filePath 中文文件路径
     * @throws URISyntaxException uri异常
     * @throws IOException        io异常
     */
    public static void encode(String filePath) throws URISyntaxException, IOException {
        URL resource = Util.class.getResource(filePath);
        File file = new File(resource.toURI());
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "GBK"));
        StringBuilder builder = new StringBuilder();
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            String[] split = line.split("=");
            String utf8Encode = toUnicodeEncode(split[1]);
            String newLine = split[0] + "=" + utf8Encode;
            builder.append(newLine).append("\n");
        }
        System.out.println(builder.toString());
    }

    /**
     * 将可读的字符串转为 unicode,仅对汉字处理,英文字母及标点符合不做处理
     *
     * @param readableWord 可读的字符串
     * @return unicode码
     */
    public static String toUnicodeEncode(String readableWord) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < readableWord.length(); i++) {
            char c = readableWord.charAt(i);
            // 判断该char 是不是英文或者 ( )
            if (c <= 127) {
                builder.append(c);
            } else {
                String s = Integer.toHexString(c);
                builder.append("\\u").append(s);
            }
        }
        return builder.toString();
    }

    /**
     * 将unicode转化为汉字编码
     *
     * @param  testFilePath unicode编码的文件
     * @throws URISyntaxException uri异常
     * @throws IOException        文件异常
     */
    public static void decode(String testFilePath ) throws URISyntaxException, IOException {
        URL resource = Util.class.getResource(testFilePath);
        File file = new File(resource.toURI());
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
        StringBuilder builder = new StringBuilder();
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            String[] split = line.split("=");
            builder.append(split[0]).append("=");
            toUnicodeDecode(split[1], builder);
            builder.append("\n");
        }
        System.out.println(builder.toString());
    }

    /**
     * 递归处理每一行中的unicode编码
     *
     * @param unicodeToken unicode编码后的字符串
     * @param value     值
     */
    private static void toUnicodeDecode(String unicodeToken, StringBuilder value) {
        if (unicodeToken.equals("")) {
            return;
        }
        if (unicodeToken.startsWith("\\u")) {
            String unicodeEncodeStr = unicodeToken.substring(0, 6);
            value.append(dealUnicode(unicodeEncodeStr));
            unicodeToken = unicodeToken.substring(6);
        } else {
            // 获取第一个/ 所在的下标
            int index = unicodeToken.indexOf("\\");
            if (index == -1) {
                value.append(unicodeToken);
                return;
            } else {
                String ascStr = unicodeToken.substring(0, index);
                value.append(ascStr);
                unicodeToken = unicodeToken.substring(index);
            }

        }
        toUnicodeDecode(unicodeToken, value);
    }


    /**
     * 将单个unicode吗转为汉字,即将4个16进制的字符串转为char
     *
     * @param unicodeEncodeStr unicode码
     * @return 汉字
     */
    private static String dealUnicode(String unicodeEncodeStr) {
        String subValue = unicodeEncodeStr.substring(2);
        // 16进制parse整形字符串
        char valueChar = (char) Integer.parseInt(subValue, 16);
        return new Character(valueChar).toString();
    }
}

说明:

随意指定你的输入文本 originFilePath ,写入你的配置文件,形如 1000=xxx不能为空,然后执行 encode();输出的结果就是按行转换好的 encode编码文本;若对转译不放心,可以进行反向测试 ;将上一步的结果copy到 testFilePath 对应的文本中,然后执行 decode();输出的结果应和 originFilePath的文本一致;
若有对应的io异常,请检查指定的文件路径是否存在;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值