java 实现Unicode与普通字符(包括中文)的转换
今天使用zl464发送tts语音播报,文档上面明确要求中文编码是UTF-8,但是我发过去的中文,它全都不认识,最后实验出来需要将字符串转成Unicode它就认识了,下面记录了java中文转Unicode的方法。
Java实现Unicode与普通字符的转换
什么是Unicode?与UTF-8、UTF-16、UTF-32是什么关系?
Unicode是一个字符编码标准,负责分配某个字符在Unicode字符集中的序号。
UTF-8、UTF-16、UTF-32等则是具体的编码方案,也就是将字符在Unicode字符集中的序号转换为具体的编码方案。
如:
UTF-8是针对不同范围的序号转换成不同长度的字符编码,最短编码为一个字节(8bit),可兼容ASCII;
UTF-16跟UTF-8类似,不过最短编码为两个字节(16bit),不可兼容ASCII;
当前Unicode能容纳的最大编号为2^32 - 1,也就是32bit,所以UTF-32是每个字符长度固定为32bit的定长编码。
如何进行转换?
知道什么是Unicode以后,代码就很简单了:将字符对应的Unicode编码转为16进制,并加上\u前缀即可转为Unicode;剥离Unicode的\u前缀即可获得其在Unicode字符集的序号,转成String即可。
引用原文链接:https://blog.csdn.net/java_t_t/article/details/127840074
package com.photon.core.DataApi.Utils;import com.alibaba.fastjson.JSON;import java.util.HashMap;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;public class UnicodeCharConvert { private static final Pattern PATTERN_UNICODE = Pattern.compile("\\\\u[a-f0-9A-F]{1,4}"); private static String unicodeToChar(String unicode) { if (unicode == null || unicode.isEmpty()) { return unicode; } StringBuffer str = new StringBuffer(); String[] hex = unicode.split("\\\\u"); for (int index = 1; index < hex.length; index++) { int data = Integer.parseInt(hex[index], 16); str.append((char) data); } return str.toString(); } public static String charToUnicode(String str) { if (str == null || str.isEmpty()) { return str; } StringBuffer unicode = new StringBuffer(); for (int index = 0; index < str.length(); index++) { char c = str.charAt(index); // 转换为unicode String tmp = Integer.toHexString(c); if (tmp.length() >= 4) { unicode.append("\\u" + tmp); } else if (tmp.length() == 3) { unicode.append("\\u0" + tmp); } else if (tmp.length() == 2) { unicode.append("\\u00" + tmp); } else if (tmp.length() == 1) { unicode.append("\\u000" + tmp); } else if (tmp.length() == 3) { unicode.append("\\u0000"); } } return unicode.toString(); } public static String mixStrToString(String mixStr) { if (mixStr == null || mixStr.isEmpty()) { return mixStr; } int start = 0; StringBuffer result = new StringBuffer(); Matcher matcher = PATTERN_UNICODE.matcher(mixStr); while (matcher.find()) { String oldChar = matcher.group(); result.append(mixStr.substring(start, matcher.start())); result.append(unicodeToChar(oldChar)); start = matcher.start() + oldChar.length(); } result.append(mixStr.substring(start)); return result.toString(); } public static String mixStrToUnicode(String mixStr) { if (mixStr == null || mixStr.isEmpty()) { return mixStr; } int start = 0; StringBuffer result = new StringBuffer(); Matcher matcher = PATTERN_UNICODE.matcher(mixStr); while (matcher.find()) { String oldChar = matcher.group(); result.append(charToUnicode(mixStr.substring(start, matcher.start()))); result.append(oldChar); start = matcher.start() + oldChar.length(); } result.append(charToUnicode(mixStr.substring(start))); return result.toString(); } public static String string2Unicode(String string) { StringBuffer unicode = new StringBuffer(); for (int i = 0; i < string.length(); i++) { // 取出每一个字符 char c = string.charAt(i); if (c < 0x20 || c > 0x7E) { // 转换为unicode String tmp = Integer.toHexString(c); if (tmp.length() >= 4) { unicode.append("\\u" + Integer.toHexString(c)); } else if (tmp.length() == 3) { unicode.append("\\u0" + Integer.toHexString(c)); } else if (tmp.length() == 2) { unicode.append("\\u00" + Integer.toHexString(c)); } else if (tmp.length() == 1) { unicode.append("\\u000" + Integer.toHexString(c)); } else if (tmp.length() == 3) { unicode.append("\\u0000"); } } else { unicode.append(c); } } return unicode.toString(); } public static void main(String[] args) { Map v = new HashMap<>();// Channel channel = channelMap.get(IMEI); v.put("tts", UnicodeCharConvert.charToUnicode("您好,您的订单即将结束,剩余时间15分钟,如需延时,请尽快续约!")); v.put("vol", 100); String strPacket = JSON.toJSONString(v); System.out.println(msg); System.out.println(strPacket); //map 转成json 后会有多余的反斜杠需要去掉 System.out.println(strPacket.replace("\\\\", "\\")); }}
来源地址:https://blog.csdn.net/liwang2016384/article/details/131471332
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341