用一段時間在使用JSF的時候發現了這樣一個問題,在用鏈接傳遞帶中文的參數時,接收時會得到類似 &#nnnnn;的字元, java無法解析和使用,這兩天有時間研究了一下,發現只有在使用myfaces 1.1.3 時的時候纔會有這個問題,而&#nnnnn; 中的n 其實是中文的unicode 碼的十進制,我參考了些資料,寫了個轉換的類請大家指教
*將中文轉成瀏覽器可以自動編解碼的
*類似&#nnnnn;的字元
*
*/
publicstaticStringgb2Unicode(Strings)...{
StringBufferretstr=newStringBuffer();
for(inti=0;i<s.length();i++)...{
charc=s.charAt(i);
if(c>=0&&c<=255)...{
retstr.append(c);
}else...{
retstr.append("&#").append(Integer.toString(s.charAt(i))).append(";");
}
}
returnretstr.toString();
}
/**//*
*將瀏覽器可以自動編解碼的類似&#nnnnn;的字元轉成中文的
*例如:"基金"得到的中文字爲"基金"
*/
publicstaticStringunicode2Gb(Strings)...{
StringBufferretstr=newStringBuffer();
StringregEx="^&#\d{5};$";
Patternp=Pattern.compile(regEx);
for(inti=0;i<s.length();)...{
if(s.charAt(i)=='&')...{
Stringtmp=s.substring(i,i+8);
Matcherm=p.matcher(tmp);
if(m.find())...{
intj=Integer.parseInt(tmp.substring(2,7));
retstr.append((char)j);
i+=8;
}else...{
retstr.append(s.charAt(i));
i++;
}
}else...{
retstr.append(s.charAt(i));
i++;
}
}
returnretstr.toString();
}
/**//*
*將unicode碼轉成中文的
*例如:"䟺"得到的中文字爲"基"
*/
publicstaticStringconvert(Stringsource)...{
if(null==source||"".equals(source))...{
returnsource;
}
StringBuffersb=newStringBuffer();
inti=0;
while(i<source.length())...{
if(source.charAt(i)=='\')...{
System.out.println(source.substring(i+2,i+6));
intj=Integer.parseInt(source.substring(i+2,i+6),16);
sb.append((char)j);
i+=6;
}else...{
sb.append(source.charAt(i));
i++;
}
}
returnsb.toString();
}
/***//**
*
*測試方法
*/
publicstaticvoidmain(String[]args)throwsUnsupportedEncodingException...{
Stringji="基金寶典";
Stringuji=gb2Unicode(ji);
System.out.println(uji);
System.out.println(unicode2Gb(uji));
}
最近在網上發現有人解決相同的問題而且很高效,不過使用ASP,引用一下供參考
問題:
這是因爲IE會自動把吱吲轉換爲漢字顯示。
我的問題是,如何高效地做一個反過程?比如給一個字符串“吱吲”,要轉換爲:吱吲
在asp和javascript中其實都很容易可以實現,asp用ascW(),java用charCodeAt(),得到一個字符的ascii編碼,然後根據字符串長度給一個循環就搞定了。
但是問題來了,如果給的字符串不僅僅是“吱吲”,而是一篇有幾萬字的文章,也就是說轉換編碼的時候要運行幾萬次循環。
請幫忙看看有沒有什麼高效的方法可以不使用循環就把字符串轉爲&#xxxxx;的格式?不知道asp/javascript有沒有相關的函數?就好比如IE瀏覽器可以很快就加載上萬字的&#xxxxx;格式的內容而不佔多少CPU。
貼出代碼給大家分享!這是實現NCR編碼的方式,可以保證在任何網頁編碼中都正常顯示字符而不會亂碼!
這個效率應該是最高了,實際測試轉換一篇幾萬字的文章還不用1秒。而以前用循環的方式來做,少則要幾分鐘,經常導致服務器死機!
順便推薦一下我製作的手機新聞網站3g網(3gONE.net),你可以用手機來瀏覽csdn、各種分類新聞啦,如果你用PDA的話,還可以離線瀏覽新聞資訊呢!
請大家多提提建議!
unctionNCR_CODE(str)'
str=escape(str)
DimobjRegExp,Match,Matches
SetobjRegExp=NewRegexp
objRegExp.IgnoreCase=True
objRegExp.Global=True
objRegExp.Pattern="%u([0-f][0-f][0-f][0-f])"
str=objRegExp.Replace(str,"#&x$1;")
objRegExp.Pattern="%([0-f][0-f])"
NCR_CODE=objRegExp.Replace(str,"#&x$1;")
endfunction