1. 程式人生 > >java中Unicode碼與中文的轉化

java中Unicode碼與中文的轉化

什麼是unicode

unicode(統一碼、萬國碼、單一碼)是電腦科學領域裡的一項業界標準,包括字符集、編碼方案等。Unicode是為了解決傳統的字元編碼方案的侷限而產生的,它為每種語言中的每個字元設定了統一併且唯一的二進位制編碼,以滿足跨語言、跨平臺進行文字轉換、處理的要求。1990年開始研發,1994年正式公佈。unicode碼是一種標準,utf-8是一種unicode的實現方式之一。

關於ASCII,Unicode和UTF-8之間的關聯和區別,可參照我的這篇部落格:

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