亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java 關于中文亂碼問題的解決方案與經驗 (1)

2019-11-18 14:18:36
字體:
來源:轉載
供稿:網友

  一、字節和unicode

java內核是unicode的,就連class文件也是,但是很多媒體,包括文件/流的保存方式是使用字節流的。因此Java要對這些字節流經行轉化。char是unicode的,而byte是字節。Java中byte/char互轉的函數在sun.io的包中間有。其中ByteToCharConverter類是中調度,可以用來告訴你,你用的convertor。其中兩個很常用的靜態函數是:



public static ByteToCharConverter getDefault();
public static ByteToCharConverter getConverter(String encoding);


假如你不指定converter,則系統會自動使用當前的encoding,gb平臺上用gbk,en平臺上用8859_1。


byte ??〉char:
"你"的gb碼是:0xc4e3 ,unicode是0x4f60
String encoding = "gb2312";
byte b[] = {(byte)′u00c4′,(byte)′u00e3′};
ByteToCharConverter converter = ByteToCharConverter.getConverter(encoding);
char c[] = converter.convertAll(b);
for (int i = 0; i < c.length; i++) {
System.out.PRintln(Integer.toHexString(c[i]));
}
結果是什么?0x4f60
假如encoding ="8859_1",結果又是什么?0x00c4,0x00e3


假如代碼改為:

byte b[] = {(byte)′u00c4′,(byte)′u00e3′};
ByteToCharConverter converter = ByteToCharConverter. getDefault();
char c[] = converter.convertAll(b);
for (int i = 0; i < c.length; i++) {
System.out.println(Integer.toHexString(c[i]));
}




結果將又是什么?

這就要根據平臺的編碼而定。


char ??〉byte:
String encoding = "gb2312";
char c[] = {′u4f60′};
CharToByteConverter converter = CharToByteConverter.getConverter(encoding);
byte b[] = converter.convertAll(c);
for (int i = 0; i < b.length; i++) {
System.out.println(Integer.toHexString(b[i]));
}
結果是什么?0x00c4,0x00e3
假如encoding ="8859_1",結果又是什么?0x3f
假如代碼改為
String encoding = "gb2312";
char c[] = {′u4f60′};
CharToByteConverter converter = CharToByteConverter.getDefault();
byte b[] = converter.convertAll(c);
for (int i = 0; i < b.length; i++) {
System.out.println(Integer.toHexString(b[i]));
}




結果將又是什么?還是根據平臺的編碼而定。

很多中文問題就是從這兩個最簡單的類派生出來的。而卻有很多類不直接支持把encoding輸入,這給我們帶來諸多不便。很多程序難得用encoding了,直接用default的encoding,這就給我們移植帶來了很多困難。

二、utf-8

utf-8是和unicode一一對應的,其實現很簡單:


7位的unicode: 0 _ _ _ _ _ _ _
11位的unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _
16位的unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
21位的unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _




大多數情況是只使用到16位以下的unicode:


"你"的gb碼是:0xc4e3 ,unicode是0x4f60
0xc4e3的二進制:
1100 ,0100 ,1110 ,0011




由于只有兩位我們按照兩位的編碼來排,但是我們發現這行不通,因為第7位不是0因此,返回"?"


0x4f60的二進制:
0100 ,1111 ,0110 ,0000
我們用utf-8補齊,變成:
1110 ,0100 ,1011 ,1101 ,1010 ,0000
e4--bd-- a0
于是返回:0xe4,0xbd,0xa0。




三、string和byte[]

string其實核心是char[],然而要把byte轉化成string,必須經過編碼。string.length()其實就是char數組的長度,假如使用不同的編碼,很可能會錯分,造成散字和亂碼。例如:


String encoding = “”;
byte [] b={(byte)′u00c4′,(byte)′u00e3′};
String str=new String(b,encoding);




假如encoding=8859_1,會有兩個字,但是encoding=gb2312只有一個字這個問題在處理分頁是經常發生。

四、Reader,Writer / InputStream,OutputStream

Reader和Writer核心是char,InputStream和OutputStream核心是byte。但是Reader和Writer的主要目的是要把char讀/寫InputStream/OutputStream。例如:


文件test.txt只有一個"你"字,0xc4,0xe3
String encoding = "gb2312";
InputStreamReader reader = new InputStreamReader(new FileInputStream(
"text.txt"), encoding);
char c[] = new char[10];
int length = reader.read(c);
for (int i = 0; i < length; i++) {
System.out.println(c[i]);
}




結果是什么?是"你"。假如encoding ="8859_1",結果是什么?"??"兩個字符,表示不熟悉。反過來的例子自己做。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲天堂男人天堂女人天堂| 69视频在线免费观看| 97超碰蝌蚪网人人做人人爽| 国产精品夜间视频香蕉| 亚洲精品久久久久久久久| 91在线视频九色| 日韩视频第一页| 国产激情久久久久| 欧美理论在线观看| 国产91热爆ts人妖在线| 国内精品久久久久久影视8| 中文字幕亚洲无线码a| 韩国精品美女www爽爽爽视频| 国产欧美一区二区三区四区| 国产精品成久久久久三级| 国产日韩精品在线| 欧美有码在线视频| 亚洲香蕉成人av网站在线观看| 日韩在线视频观看正片免费网站| 久久青草精品视频免费观看| 日韩成人中文字幕| 亚洲一区二区三区四区在线播放| 日韩精品免费综合视频在线播放| 久久精品青青大伊人av| 亚洲精品成人网| 2019精品视频| 亚洲精品美女久久久| 狠狠色噜噜狠狠狠狠97| 亚洲免费伊人电影在线观看av| 欧美中文字幕视频| 欧美日本亚洲视频| 国产在线观看91精品一区| 亚洲成**性毛茸茸| 97在线视频精品| 国产精品99久久久久久久久| 欧美性xxxxx极品娇小| 欧美午夜激情在线| 亚洲欧美国产一区二区三区| 91久久精品美女高潮| 伊人久久久久久久久久久久久| 中文字幕在线日韩| 91精品视频免费看| 精品在线观看国产| 91美女片黄在线观| 美女999久久久精品视频| 亚洲电影免费观看高清完整版| 欧美成人高清视频| 69视频在线播放| 亚洲理论在线a中文字幕| 国产区精品视频| 日韩欧美在线中文字幕| 亚洲精品一区久久久久久| 国产精品视频一| 亚洲天天在线日亚洲洲精| 国产福利视频一区二区| 亚洲欧美在线看| 日韩欧美国产中文字幕| 亚洲电影免费观看高清完整版在线观看| 欧美性黄网官网| 亚洲精品国产成人| 成人精品久久av网站| 在线a欧美视频| 亚洲精品日韩av| 久久精品电影网站| 伊人久久久久久久久久| 国产精品美女www| 亚洲欧洲日产国产网站| 日韩av电影手机在线| 精品久久久久久久久久久久久| 日韩精品黄色网| 成人精品一区二区三区| 欧美精品福利在线| 日韩在线免费高清视频| 日韩美女福利视频| 日韩激情第一页| 中文字幕欧美视频在线| 亚洲精品国产美女| 国产精品爱啪在线线免费观看| 国产亚洲精品久久久久久牛牛| 亚洲bt欧美bt日本bt| 久久中文字幕视频| 久久国产精品网站| 欧美在线视频观看免费网站| 九色91av视频| 亚洲一区中文字幕| 欧美国产亚洲精品久久久8v| 国产精品成人久久久久| 国产午夜精品视频免费不卡69堂| 欧美激情欧美狂野欧美精品| 精品国内自产拍在线观看| 欧洲亚洲女同hd| 亚洲精品98久久久久久中文字幕| 精品久久香蕉国产线看观看gif| 欧洲亚洲在线视频| 亚洲欧美视频在线| 韩国精品久久久999| 欧美性猛交99久久久久99按摩| 国产精品jizz在线观看麻豆| 国产日韩专区在线| 国产经典一区二区| 色综合91久久精品中文字幕| 国产成人精品国内自产拍免费看| 久久久www成人免费精品张筱雨| 亚洲娇小xxxx欧美娇小| 午夜精品久久久久久久白皮肤| 91久久久久久国产精品| 尤物九九久久国产精品的分类| 久久亚洲国产精品成人av秋霞| 欧美精品久久久久久久久| 日韩av手机在线观看| 亚洲成年网站在线观看| 精品一区二区三区三区| 日韩精品极品视频免费观看| 亚洲国产精品电影在线观看| 一区二区三区高清国产| 久久成年人视频| 欧美日韩国产丝袜另类| 亚洲美腿欧美激情另类| 日韩欧美高清在线视频| 国产精品久久久久久久久男| 一本色道久久综合狠狠躁篇怎么玩| 久久精品99久久久香蕉| 国产精品一区二区电影| 91九色在线视频| 国产精品福利在线| 精品久久久久久久久国产字幕| 亚洲第一免费播放区| 亚洲精品一区二区久| 欧美视频在线免费| 亚洲成人精品视频在线观看| 国产美女久久精品香蕉69| 成人黄色生活片| 日韩精品欧美激情| 国产91精品久| 久久久精品2019中文字幕神马| 日本精品视频在线观看| 欧美视频国产精品| 成人黄色在线观看| 亚洲精品久久久久久下一站| 欧美成人性色生活仑片| 一区二区三区四区精品| 国产一区二区三区直播精品电影| 中文字幕综合在线| 亚洲精品日韩久久久| 亚洲色图25p| 亚洲伊人成综合成人网| 中文字幕亚洲一区二区三区五十路| 国产成人午夜视频网址| 亚洲欧洲高清在线| 欧美性猛交xxxx富婆| 国内外成人免费激情在线视频网站| 色噜噜狠狠狠综合曰曰曰| 日韩av影视综合网| 高清视频欧美一级| 日韩中文字幕免费| 91精品国产91久久久久久最新| 国产精品久久久久久久av大片| 1769国内精品视频在线播放| 亚洲国产精久久久久久久| 日韩精品中文字幕久久臀| 精品一区二区亚洲| 亚洲天堂男人的天堂| 中文字幕在线看视频国产欧美| 欧洲成人免费视频|