java中Unicode码与中文的转化

什么是unicode

unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。unicode码是一种标准,utf-8是一种unicode的实现方式之一。

关于ASCII,Unicode和UTF-8之间的关联和区别,可参照我的这篇博客:

http://blog.csdn.net/csdn_ds/article/details/72830771

Unicode码与中文的转化

Unicode码和中文的转化一般有两种方式:

1、通过jdk自带的工具native2ascii,通过命令行进行中文和unicode码的转化。

2、通过java代码进行转化。

此处,关于第一种方式,不介绍,介绍一下通过java代码的转化,测试代码如下:

package com.tooklili.service.test.dataoke;

import org.apache.commons.lang.StringUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * unicode码转换测试
 * 
 * @author shuai.ding
 *
 * @date 2017年5月31日下午5:41:15
 */
public class UnicodeTest {

	private static final Logger LOGGER = LoggerFactory.getLogger(UnicodeTest.class);

	/**
	 * unicode编码测试
	 * 
	 * @author shuai.ding
	 */
	@Test
	public void unicodeEncodeTest() {
		String s = "你好";
		String unicode = string2Unicode(s);
		LOGGER.info("中文字符串:{}",s);
		LOGGER.info("编码后的字符串:{}",unicode);
	}

	/**
	 * unicode解码测试
	 * 
	 * @author shuai.ding
	 */
	@Test
	public void unicodeDecodeTest() {
		// 在java中"\"是转义字符,所以防止转义,必须写成下面的形式
		// String s = "\\u0061\\u0041\\u4f60\\u597d\\u0024\\u006e\\u0067\\u006e\\u0031";
		String s = "\\u5168\\u7ad9\\u63a5\\u53e3\\u5df2\\u5347\\u7ea7\\u4e3a\\u5206\\u9875\\u6a21\\u5f0f\\uff0c\\u6bcf\\u987550\\u6761\\u6570\\u636e\\uff0c\\u5206\\u9875\\u53c2\\u6570\\uff1a&page";
		LOGGER.info("unicode码:{}",s);
		String str = unicode2String(s);
		LOGGER.info("转码后的字符串:{}",str);
	}
	
	@Test
	public void unicodeToOutTest(){
		String s="\u4f60\u597d";
		LOGGER.info("unicode字符串在java中输出会自动转化:{}",s);
	}

	
	/**
	 * 将字符串转化成unicode码
	 * @author shuai.ding
	 * @param string
	 * @return
	 */
	private String string2Unicode(String string) {

		if (StringUtils.isBlank(string)) {
			return null;
		}

		char[] bytes = string.toCharArray();
		StringBuffer unicode = new StringBuffer();
		for (int i = 0; i < bytes.length; i++) {
			char c = bytes[i];

			// 标准ASCII范围内的字符,直接输出
			if (c >= 0 && c <= 127) {
				unicode.append(c);
				continue;
			}
			String hexString = Integer.toHexString(bytes[i]);

			unicode.append("\\u");

			// 不够四位进行补0操作
			if (hexString.length() < 4) {
				unicode.append("0000".substring(hexString.length(), 4));
			}
			unicode.append(hexString);
		}
		return unicode.toString();
	}

	
	/**
	 * 将unicode码转化成字符串
	 * @author shuai.ding
	 * @param unicode
	 * @return
	 */
	private String unicode2String(String unicode) {
		if (StringUtils.isBlank(unicode)) {
			return null;
		}

		StringBuilder sb = new StringBuilder();
		int i = -1;
		int pos = 0;

		while ((i = unicode.indexOf("\\u", pos)) != -1) {
			sb.append(unicode.substring(pos, i));
			if (i + 5 < unicode.length()) {
				pos = i + 6;
				sb.append((char) Integer.parseInt(unicode.substring(i + 2, i + 6), 16));
			}
		}
		//如果pos位置后,有非中文字符,直接添加
		sb.append(unicode.substring(pos));

		return sb.toString();
	}
}

测试输出结果:

INFO [com.tooklili.service.test.dataoke.UnicodeTest] 28 - 中文字符串:你好 
INFO [com.tooklili.service.test.dataoke.UnicodeTest] 29 - 编码后的字符串:\u4f60\u597d 
INFO [com.tooklili.service.test.dataoke.UnicodeTest] 50 - unicode字符串在java中输出会自动转化:你好 
INFO [com.tooklili.service.test.dataoke.UnicodeTest] 42 - unicode码:\u5168\u7ad9\u63a5\u53e3\u5df2\u5347\u7ea7\u4e3a\u5206\u9875\u6a21\u5f0f\uff0c\u6bcf\u987550\u6761\u6570\u636e\uff0c\u5206\u9875\u53c2\u6570\uff1a&page 
INFO [com.tooklili.service.test.dataoke.UnicodeTest] 44 - 转码后的字符串:全站接口已升级为分页模式,每页50条数据,分页参数:&page 



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值