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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java解析xml中文字符乱码_各种Java中文乱码的处理方法

發(fā)布時間:2023/12/1 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java解析xml中文字符乱码_各种Java中文乱码的处理方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

對于Java,由于默認的編碼方式是UNICODE,所以用中文也易出問題,常見的解決是:

String?s2?=?new?String(s1.getBytes(“ISO-8859-1”),”GBK”);

1、utf8解決JSP中文亂碼問題

一般說來在每個頁面的開始處,加入:

pageEncoding="UTF-8"%>

request.setCharacterEncoding("UTF-8");

%>

◆charset=UTF-8的作用是指定JSP向客戶端輸出的編碼方式為“UTF-8”;

◆pageEncoding="UTF-8",為了讓JSP引擎能正確地解碼含有中文字符的JSP頁面,這在LINUX中很有效;

◆request.setCharacterEncoding("UTF-8");是對請求進行了中文編碼。

有時,這樣仍不能解決問題,還需要這樣處理一下:

String?msg?=?request.getParameter("message");

String?str=new?String(msg.getBytes("ISO-8859-1"),"UTF-8");

out.println(st);

2、Tomcat?5.5中文亂碼

只要把%TOMCAT安裝目錄%/???webapps\servlets-examples\WEB-INF\classes\filters\SetCharacterEncodingFilter.class文件拷到你的webapp目錄/filters下,如果沒有filters目錄,就創(chuàng)建一個。

2)在你的web.xml里加入如下幾行:

Set???Character???Encoding

filters.SetCharacterEncodingFilter

encoding

GBK

Set???Character???Encoding

/*

3)完成

2、get方式的解決辦法

1)打開tomcat的server.xml文件,找到區(qū)塊,加入如下一行:

URIEncoding=”GBK”

完整的應(yīng)如下:

port="80"???maxThreads="150"???minSpareThreads="25"???maxSpareThreads="75"

enableLookups="false"???redirectPort="8443"???acceptCount="100"

debug="0"???connectionTimeout="20000"

disableUploadTimeout="true"

URIEncoding="GBK"

/>

2)重啟tomcat,一切OK。

3、xmlHttpRequest中文問題

頁面jsp用的GBK編碼

代碼:

javascript部分

代碼:

function?addFracasReport()?{

var?url="controler?actionId=0_06_03_01&actionFlag=0010";

var?urlmsg="&reportId="+fracasReport1.textReportId.value;??//故障報告表編號

var?xmlHttp=Common.createXMLHttpRequest();

xmlHttp.onreadystatechange?=?Common.getReadyStateHandler(xmlHttp,

eval("turnAnalyPage"));

xmlHttp.open("POST",url,true);

xmlHttp.setRequestHeader(?"?Content-Type?"?,?"

application/x-www-form-urlencoded);

xmlHttp.send(urlmsg);

}

#p#

后臺java中獲得的reportId是亂碼,不知道該怎么轉(zhuǎn),主要是不知道xmlHttp.send(urlmsg);以后是什么編碼?在后面用java來轉(zhuǎn),試了幾種,都沒有成功,其中有:

代碼:

public?static?String?UTF_8ToGBK(String?str)?{

try?{

return?new?String(str.getBytes("UTF-8"),?"GBK");

}?catch?(Exception?ex)?{

return?null;

}

}

public?static?String?UTF8ToGBK(String?str)?{

try?{

return?new?String(str.getBytes("UTF-16BE"),?"GBK");

}?catch?(Exception?ex)?{

return?null;

}

}

public?static?String?GBK(String?str)?{

try?{

return?new?String(str.getBytes("GBK"),"GBK");

}?catch?(Exception?ex)?{

return?null;

}

}

public?static?String?getStr(String?str)?{

try?{

String?temp_p?=?str;

String?temp?=?new?String(temp_p.getBytes("ISO8859_1"),?"GBK");

temp?=?sqlStrchop(temp);

return?temp;

}?catch?(Exception?e)?{

return?null;

}

}

4、JDBC?ODBC?Bridge的Bug及其解決方法

在編寫一數(shù)據(jù)庫管理程序時,發(fā)現(xiàn)JDBC-ODBC?Bridge存在不易發(fā)現(xiàn)的Bug。在向數(shù)據(jù)表插入數(shù)據(jù)時,如果為英文字符,存儲內(nèi)容完全正確,如果存入中文字符,部分數(shù)據(jù)庫只能存儲前七八個中文字符,其他內(nèi)容被截去,導致存儲內(nèi)容的不完整(有些數(shù)據(jù)庫不存在這個問題,如Sybase?SQL?Anywhere?5.0。JDBC-ODBC?Bridge還存在無法建表的Bug)。

對于廣大需要存儲中文信息的Java程序員來說,這可是一個不好的消息。要么改用其他語言編程,要么選擇其他價格昂貴的數(shù)據(jù)庫產(chǎn)品。“一次編寫,到處運行”的目標,也大打折扣。能不能采用變通的方法,將中文信息進行處理后再存儲來解決這個問題呢?答案是肯定的。

解決問題的具體思路、方法

Java采用Unicode碼編碼方式,中英文字符均采用16bit存儲。既然存儲英文信息是正確的,根據(jù)一定規(guī)則,將中文信息轉(zhuǎn)換成英文信息后存儲,自然不會出現(xiàn)截尾現(xiàn)象。讀取信息時再進行逆向操作,將英文信息還原成中文信息即可。由GB2312編碼規(guī)則可知,漢字一般為二個高位為1的ASCII碼,在轉(zhuǎn)換時將一個漢字的二個高位1去掉,還原時再將二個高位1加上。為了處理含有英文字符的中文字串,對英文字符則需要加上一個Byte?0標記。以下提供的兩個公用靜態(tài)方法,可加入任何一個類中使用。

將中英文字串轉(zhuǎn)換成純英文字串

public?static?String?toTureAsciiStr(String?str){

StringBuffer?sb?=?new?StringBuffer();

byte[]?bt?=?str.getBytes();

for(int?i?=0?;i〈bt.length;i++){

if(bt[i]〈0){

//是漢字去高位1

sb.append((char)(bt[i]&&0x7f));

}else{//是英文字符?補0作記錄

sb.append((char)0);

sb.append((char)bt[i]);

}

}

return?sb.toString();

}

將經(jīng)轉(zhuǎn)換的字串還原

public?static?String?unToTrueAsciiStr(String?str){

byte[]?bt?=?str.getBytes();

int?i,l=0,length?=?bt.length,j=0;

for(i?=?0;i〈length;i++){

if(bt[i]?==?0){

l++;

}

}

byte?[]bt2?=?new?byte[length-l];

for(i?=0?;i〈length;i++){

if(bt[i]?==?0){

i++;

bt2[j]?=?bt[i];

}else{

bt2[j]?=?(byte)(bt[i]|0x80);

}

j++;

}

String?tt?=?new?String(bt2);

return?tt;

}

上例在實際編程中效果很好,只是存儲的中文信息需要經(jīng)過同樣處理,才能被其他系統(tǒng)使用。而且如果中文字串出現(xiàn)英文字符,實際上增加了額外的存儲空間。

#p#

5、Solaris下Servlet編程的中文問題及解決辦法

在使用Java開發(fā)Internet上的一個應(yīng)用系統(tǒng)時,發(fā)現(xiàn)在Windows下調(diào)試完全正常的Servlet,上傳到Solaris服務(wù)器上,運行卻出現(xiàn)故障——返回的網(wǎng)頁不能顯示中文,應(yīng)為中文的信息全為亂碼;用中文信息做關(guān)鍵字,不能正確檢索數(shù)據(jù)庫。后來采用加入檢查代碼等方法探知故障原因如下:

顯示亂碼主要是因為通過類HttpServletResponse提供的方法setContentType無法改變返回給客戶的數(shù)據(jù)的編碼方式,正確的編碼方式應(yīng)為GB2312或者GBK,而事實上為缺省的ISO8859-1。無法檢索中文信息則是因為,客戶提交的中文信息經(jīng)瀏覽器編碼到達服務(wù)器后,Servlet無法將其正確解碼。

舉例說明顯示亂碼解決方法

Servlet一般通常做法如下:

public?class?ZldTestServlet?extends?HttpServlet?{

public?void?doGet?(HttpServletRequest?request,

HttpServletResponse?response)throws?ServletException,IOException{

//在使用?Writer向瀏覽器返回數(shù)據(jù)前,設(shè)置?content-type?header,在這里設(shè)置相應(yīng)的字符集gb2312

response.setContentType("text/html;charset=gb2312");

PrintWriter?out?=?response.getWriter();?//*

//?正式返回數(shù)據(jù)

out.println("〈html〉〈head〉〈title〉Servlet?test〈/title〉〈/head〉"?);

out.println("這是一個測試頁!");

out.println("〈/body〉〈/html〉");

out.close();

}

...

}

解決頁面顯示亂碼問題,需將*處代碼換成如下內(nèi)容:

PrintWriter?out?=?new?PrintWriter(new?OutputStreamWriter(response.getOutputStream(),"gb2312"));

Solaris中文信息檢索問題的解決

瀏覽器利用表單向服務(wù)器提交信息時,一般采用x-www-form-urlencoded?的MIME格式對數(shù)據(jù)進行編碼。如果使用get方法,參數(shù)名稱和參數(shù)值經(jīng)編碼后附加在URL后,在Java中稱作查詢串(query?string)。

在Servlet程序中,如果采用ServletRequest的方法getParameter取得參數(shù)值,在Solaris環(huán)境下,對漢字卻不能正確解碼。因而無法正確檢索數(shù)據(jù)庫。

在Java?1.2的包——java.net中提供了URLEncode和URLDecode類。類URLEncode提供了按x-www-form-urlencoded格式對給定串進行轉(zhuǎn)換的方法。類URLEncode則提供了逆方法。

6、Common?Mail亂碼問題

common?mail是一個小而方便的mail包,他實現(xiàn)了對Java?Mail的封裝,使用起來十分的方便,但是我在使用他的時候發(fā)現(xiàn),使用純文本的內(nèi)容發(fā)送,結(jié)果是亂碼,代碼如下:

public?class?TestCommonMail?{

public?static?void?main(String[]?args)?throws?EmailException,?MessagingException?{

SimpleEmail?email?=?new?SimpleEmail();

email.setCharset("GB2312");

email.setHostName("smtp.163.com");

email.setSubject("test");

email.addTo("test@163.com");

email.setFrom("test@163.com");

email.setMsg("我的測試");

email.setAuthentication("test",?"test");

email.send();

}

}

分析了一下commons?mail的源碼找到了原因。源碼如下:

public?class?SimpleEmail?extends?Email

{

public?Email?setMsg(String?msg)?throws?EmailException,?MessagingException

{

if?(EmailUtils.isEmpty(msg))

{

throw?new?EmailException("Invalid?message?supplied");

}

setContent(msg,?TEXT_PLAIN);

return?this;

}

}

Email代碼片段:

public?void?setContent(Object?aObject,?String?aContentType)

{

this.content?=?aObject;

if?(EmailUtils.isEmpty(aContentType))

{

this.contentType?=?null;

}

else

{

//?set?the?content?type

this.contentType?=?aContentType;

//?set?the?charset?if?the?input?was?properly?formed

String?strMarker?=?";?charset=";

int?charsetPos?=?aContentType.toLowerCase().indexOf(strMarker);

if?(charsetPos?!=?-1)

{

//?find?the?next?space?(after?the?marker)

charsetPos?+=?strMarker.length();

int?intCharsetEnd?=

aContentType.toLowerCase().indexOf("?",?charsetPos);

if?(intCharsetEnd?!=?-1)

{

this.charset?=

aContentType.substring(charsetPos,?intCharsetEnd);

}

else

{

this.charset?=?aContentType.substring(charsetPos);

}

}

}

}

email.send();的send方法將調(diào)用

public?void?buildMimeMessage()?throws?EmailException

{

try

{

this.getMailSession();

this.message?=?new?MimeMessage(this.session);

if?(EmailUtils.isNotEmpty(this.subject))

{

if?(EmailUtils.isNotEmpty(this.charset))

{

this.message.setSubject(this.subject,?this.charset);

}

else

{

this.message.setSubject(this.subject);

}

}

//?=====================================================

//?Start?of?replacement?code

if?(this.content?!=?null)

{

this.message.setContent(this.content,?this.contentType);

}

//?end?of?replacement?code

//?=====================================================

else?if?(this.emailBody?!=?null)

{

this.message.setContent(this.emailBody);

}

else

{

this.message.setContent("",?Email.TEXT_PLAIN);

}

if?(this.fromAddress?!=?null)

{

this.message.setFrom(this.fromAddress);

}

else

{

throw?new?EmailException("Sender?address?required");

}

if?(this.toList.size()?+?this.ccList.size()?+?this.bccList.size()?==?0)

{

throw?new?EmailException(

"At?least?one?receiver?address?required");

}

if?(this.toList.size()?>?0)

{

this.message.setRecipients(

Message.RecipientType.TO,

this.toInternetAddressArray(this.toList));

}

if?(this.ccList.size()?>?0)

{

this.message.setRecipients(

Message.RecipientType.CC,

this.toInternetAddressArray(this.ccList));

}

if?(this.bccList.size()?>?0)

{

this.message.setRecipients(

Message.RecipientType.BCC,

this.toInternetAddressArray(this.bccList));

}

if?(this.replyList.size()?>?0)

{

this.message.setReplyTo(

this.toInternetAddressArray(this.replyList));

}

if?(this.headers.size()?>?0)

{

Iterator?iterHeaderKeys?=?this.headers.keySet().iterator();

while?(iterHeaderKeys.hasNext())

{

String?name?=?(String)?iterHeaderKeys.next();

String?value?=?(String)?headers.get(name);

this.message.addHeader(name,?value);

}

}

if?(this.message.getSentDate()?==?null)

{

this.message.setSentDate(getSentDate());

}

if?(this.popBeforeSmtp)

{

Store?store?=?session.getStore("pop3");

store.connect(this.popHost,?this.popUsername,?this.popPassword);

}

}

catch?(MessagingException?me)

{

throw?new?EmailException(me);

}

}

由代碼可以知道純文本方式最終調(diào)用了Java?Mail的message.setContent(this.content,?this.contentType);content是內(nèi)容,contentType是類型,如text/plain,(我們可以試試直接用Java?mail發(fā)郵件,設(shè)置文本內(nèi)容不使用setText方法,也使用setContent("測試",?"text/plain")方式,你可以看到內(nèi)容也是亂碼)。關(guān)鍵就在于text/plain,我們改成text/plain;charset=gb2312,ok亂碼解決了。在commons?mail我們看SimpleEmail類中setMsg方法調(diào)用的就是setContent(msg,?TEXT_PLAIN);我們只需要將Email類中的常量TEXT_PLAIN修改一下加入charset=你的字符集,重新打包jar,這樣就可以了。

#p#

7、toad的字符集的設(shè)置與oracle的安裝

oracle數(shù)據(jù)庫服務(wù)器的安裝一般是中文字符集,有時安裝在不同的平臺下,設(shè)置為ISO編碼,toad是oracle開發(fā)的最好工具,不是我說的,可是中文環(huán)境下安裝的toad,打開英文字符的oracle時,中文全是亂碼。必須進行設(shè)置:

環(huán)境變量---〉系統(tǒng)變量

NLS_lANG=SIMPLIFIED?CHINESE_CHINA.ZHS16GBK

NLS_lANG=AMERICAN_AMERICA.WE8ISO8859P1

AMERICAN_AMERICA.WE8MSWIN1252

或者

(1)打開注冊表,點擊HKEY_LOCAL_MATHINE;

(2)再點擊Software,再點擊ORACLE;

(3)在點擊HOME(ORACLE所在目錄);

(4)在注冊表的右半面有NLS_LANG;

(5)雙擊它,將你想要的覆蓋掉原來的,就可以了;

(6)最好記下舊的,以便可以改回來。

connect?sys/chang_on_install

update?props$

set?value$='ZHS16CGB231280'

where?name='NLS_CHARACTERSET';

commit;

這樣就OK了。

8、如何解決GWT(google?web?toolkit)中文的問題

GWT中文亂碼解決方法

(1)把你要顯示的中文“測試字符串”輸入到一個文件,如:1.txt;

(2)進入命令行,進入1.txt所在的目錄,敲入以下命令:native2ascii.exe?1.txt?2.txt回車。這樣就生成了另外一個文件2.txt;

(3)2.txt的內(nèi)容如下:\u6d4b\u8bd5\u5b57\u7b26\u4e32;

(4)然后用上面的編碼,在gwt中使用,就可以了。

9、xmlHttp得到的網(wǎng)頁怎么是亂碼?

(1)在服務(wù)器端使用WebRequest而不是xmlHttp

(2)?將

StreamReader?sr?=?new?StreamReader(stream);

對于簡體中文改成:

StreamReader?sr?=?new?StreamReader(stream?,?Encoding.Default?);

對于utf-8改成:

StreamReader?sr?=?new?StreamReader(stream?,?Encoding.UTF8?);

當然,Encoding枚舉還有很多其他的成員,對于不同的編碼content-type可以有選擇的應(yīng)用。

(3)后來我發(fā)現(xiàn)無論是content-type是gb2312還是utf-8,用

StreamReader?sr?=?new?StreamReader(stream?,?Encoding.Default?);

都可以返回正常的漢字,所以統(tǒng)一的改成Encoding.Default。

最后,在服務(wù)器端從一個url獲得網(wǎng)頁的源代碼的代碼如下:

///

///?post一個指定的url,獲得網(wǎng)頁的源代碼(用WebRequest實現(xiàn))

///

///

///

///?如果請求失敗,返回null

///?如果請求成功,返回網(wǎng)頁的源代碼

///

public?static?string?GetContentFromUrl2(?string?url?)

{

//變量定義

string?respstr;

WebRequest?myWebRequest=WebRequest.Create(url);

//????????????myWebRequest.PreAuthenticate=true;

//????????????NetworkCredential?networkCredential=

new?NetworkCredential(?username?,?password?,?domain?);

//????????????myWebRequest.Credentials=networkCredential;

//?Assign?the?response?object?of?'WebRequest'?to?a?'WebResponse'?variable.

WebResponse?myWebResponse=myWebRequest.GetResponse();

System.IO.Stream?stream?=?myWebResponse.GetResponseStream();

StreamReader?sr?=?new?StreamReader(stream?,?Encoding.Default?);

//以字符串形式讀取數(shù)據(jù)流

respstr?=?sr.ReadToEnd();

sr.Close();

return?respstr;

}

總結(jié)

以上是生活随笔為你收集整理的java解析xml中文字符乱码_各种Java中文乱码的处理方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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