日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java字符编码的转化问题

發(fā)布時(shí)間:2025/3/20 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java字符编码的转化问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概述:

? 我想字符串的編碼問(wèn)題的確會(huì)困擾到很多開發(fā)者,我最近也是被困擾到了。

? 問(wèn)題是這樣的,我們通過(guò)二維碼掃描來(lái)獲得二維碼中的信息。但是,我們的二維碼的產(chǎn)生過(guò)程卻是“多樣化”的。即在產(chǎn)生二維碼的時(shí)候是以不同的字符串編碼類型進(jìn)行編碼的。比如,GBK、GB2312、UTF-8等等。而這些不同的編碼類型會(huì)產(chǎn)生不同的字節(jié)。在Java中,GBK和GB2312都是1個(gè)漢字占2個(gè)字節(jié),UTF-8是1個(gè)漢字占3個(gè)字節(jié),而ISO編碼則是1上漢字1個(gè)字節(jié)。這樣一來(lái),我們?cè)趻呙瓒S碼的時(shí)候就會(huì)出現(xiàn)一些“陰陽(yáng)怪氣”的亂碼字符。

? 這里我們是開發(fā)二維的掃描,而二維碼的生成則在來(lái)自不同的產(chǎn)商。


我的前期實(shí)驗(yàn):

??系統(tǒng)字符格式:UTF-8

? 字符串"中國(guó)"的GB2312編碼字節(jié)數(shù)組bs_gb和UTF-8編碼字節(jié)數(shù)組bs_utf
? ??byte[] bs_gb = {-42, -48, -71, -6};
? ??byte[] bs_utf = {-28, -72, -83, -27, -101, -67};


? 實(shí)驗(yàn)步驟:

? ??1.首先對(duì)bs_gb分別使用GB2312編碼和UTF-8編碼轉(zhuǎn)化為一個(gè)中間結(jié)果:
? ? ??String gbStr1 = new String(bs_gb, "GB2312");
? ? ??String utfStr1 = new String(bs_gb, "UTF-8");
? ? ??結(jié)果:
? ? ??中國(guó)
? ? ???й?


? ??2.對(duì)utfStr1進(jìn)行GB2312編碼,實(shí)現(xiàn)從 GB2312編碼 -> UTF-8編碼 -> GB2312編碼 的過(guò)程
? ? ??String gbStr2 = new String(utfStr1.getBytes("UTF-8"), "GB2312");
? ? ??結(jié)果:錕叫癸拷
??
? ??3.對(duì)bs_utf分別使用GB2312編碼和UTF-8編碼轉(zhuǎn)化為一個(gè)中間結(jié)果:
? ? ??String gbStr3 = new String(bs_utf, "GB2312");
? ? ??String utfStr2 = new String(bs_utf, "UTF-8");
? ? ??結(jié)果:
? ? ??涓??
? ? ??中國(guó)
??
? ??4.對(duì)gbStr3進(jìn)行UTF-8編碼,實(shí)現(xiàn)從 UTF-8編碼 -> GB2312編碼 -> UTF-8編碼 的過(guò)程
? ? ??String utfStr3 = new String(gbStr3.getBytes("GB2312"), "UTF-8");
? ? ??結(jié)果:
? ? ?????
??
? ??5.依據(jù)上面4個(gè)步驟,進(jìn)行GBK和UTF-8之間的轉(zhuǎn)換實(shí)驗(yàn)


? ??實(shí)驗(yàn)的初步結(jié)論

? ? ? UTF-8編碼和GB2312編碼之間不能進(jìn)行直接轉(zhuǎn)化
? ? ? UTF-8編碼和GBK編碼之間,只能是UTF-8 -> GBK -> UTF-8


不同編碼字符之間的轉(zhuǎn)化:

? UTF-8轉(zhuǎn)化為Unicode

private static final char[] hexDigit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};private static char toHex(int nibble) {return hexDigit[(nibble & 0xF)];}/*** 將字符串編碼成 Unicode。* @param theString 待轉(zhuǎn)換成Unicode編碼的字符串。* @param escapeSpace 是否忽略空格* @return 返回轉(zhuǎn)換后Unicode編碼的字符串。*/public static String toUnicode(String theString, boolean escapeSpace) {int len = theString.length();int bufLen = len * 2;if (bufLen < 0) {bufLen = Integer.MAX_VALUE;}StringBuffer outBuffer = new StringBuffer(bufLen);for(int x=0; x<len; x++) {char aChar = theString.charAt(x);// Handle common case first, selecting largest block that// avoids the specials belowif ((aChar > 61) && (aChar < 127)) {if (aChar == '\\') { outBuffer.append('\\'); outBuffer.append('\\');continue;} outBuffer.append(aChar);continue;}switch(aChar) {case ' ': if (x == 0 || escapeSpace)outBuffer.append('\\');outBuffer.append(' ');break; case '\t':outBuffer.append('\\');outBuffer.append('t');break; case '\n':outBuffer.append('\\');outBuffer.append('n');break; case '\r':outBuffer.append('\\');outBuffer.append('r');break; case '\f':outBuffer.append('\\');outBuffer.append('f');break; case '=': // Fall through case ':': // Fall through case '#': // Fall through case '!': outBuffer.append('\\');outBuffer.append(aChar);break;default: if ((aChar < 0x0020) || (aChar > 0x007e)) {outBuffer.append('\\');outBuffer.append('u'); outBuffer.append(toHex((aChar >> 12) & 0xF));outBuffer.append(toHex((aChar >> 8) & 0xF));outBuffer.append(toHex((aChar >> 4) & 0xF));outBuffer.append(toHex( aChar & 0xF));} else { outBuffer.append(aChar);}}} return outBuffer.toString();}

? Unicode轉(zhuǎn)化為UTF-8

/*** unicode 轉(zhuǎn)換成 utf-8* * @param theString* @return*/public static String unicodeToUtf8(String theString) {char aChar;int len = theString.length();StringBuffer outBuffer = new StringBuffer(len);for (int x = 0; x < len;) {aChar = theString.charAt(x++);if (aChar == '\\') {aChar = theString.charAt(x++);if (aChar == 'u') {// Read the xxxxint value = 0;for (int i = 0; i < 4; i++) {aChar = theString.charAt(x++);switch (aChar) {case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':value = (value << 4) + aChar - '0';break;case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':value = (value << 4) + 10 + aChar - 'a';break;case 'A':case 'B':case 'C':case 'D':case 'E':case 'F':value = (value << 4) + 10 + aChar - 'A';break;default:throw new IllegalArgumentException("Malformed \\uxxxx encoding.");}}outBuffer.append((char) value);} else {if (aChar == 't')aChar = '\t';else if (aChar == 'r')aChar = '\r';else if (aChar == 'n')aChar = '\n';else if (aChar == 'f')aChar = '\f';outBuffer.append(aChar);}} elseoutBuffer.append(aChar);}return outBuffer.toString();}

? 而對(duì)于其GB2312的編碼格式是不可以在獲得一個(gè)字符串之后再轉(zhuǎn)化成其他的編碼格式的。比如,我的一個(gè)字符串為“中國(guó)”,我把它轉(zhuǎn)成GB2312的編碼格式為:涓��,再轉(zhuǎn)成UTF-8就變成了�??

? 不過(guò)還好,對(duì)于經(jīng)過(guò)GBK和ISO-8859-1這兩種格式編碼之后的字符,再進(jìn)行UTF-8的轉(zhuǎn)化,是可以轉(zhuǎn)換回來(lái)的。如下測(cè)試:

??

? 結(jié)果:

??

總結(jié)

以上是生活随笔為你收集整理的Java字符编码的转化问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。