java中Unicode碼與中文的轉化
阿新 • • 發佈:2019-01-23
什麼是unicode碼
unicode(統一碼、萬國碼、單一碼)是電腦科學領域裡的一項業界標準,包括字符集、編碼方案等。Unicode是為了解決傳統的字元編碼方案的侷限而產生的,它為每種語言中的每個字元設定了統一併且唯一的二進位制編碼,以滿足跨語言、跨平臺進行文字轉換、處理的要求。1990年開始研發,1994年正式公佈。unicode碼是一種標準,utf-8是一種unicode的實現方式之一。
關於ASCII,Unicode和UTF-8之間的關聯和區別,可參照我的這篇部落格:
Unicode碼與中文的轉化
Unicode碼和中文的轉化一般有兩種方式:
1、通過jdk自帶的工具native2ascii
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