一個將瀏覽器可以自動編解碼的類似 &#nnnnn;的字元 與中文互相轉換的類

用一段時間在使用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;的字元轉成中文的
*例如:"&#22522;&#37329;"得到的中文字爲"基金"
*/

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,引用一下供參考

問題:

請教一個問題。如附件的圖片所示,寫一個字符串作爲html的源文件,內容是&#21553;&#21554;,在IE上打開網頁會自動顯示爲漢字:“吱吲”

這是因爲IE會自動把
&#21553;&#21554;轉換爲漢字顯示。


我的問題是,如何高效地做一個反過程?比如給一個字符串“吱吲”,要轉換爲:
&#21553;&#21554;



在asp和javascript中其實都很容易可以實現,asp用ascW(),java用charCodeAt(),得到一個字符的ascii編碼,然後根據字符串長度給一個循環就搞定了。



但是問題來了,如果給的字符串不僅僅是“吱吲”,而是一篇有幾萬字的文章,也就是說轉換編碼的時候要運行幾萬次循環。



請幫忙看看有沒有什麼高效的方法可以不使用循環就把字符串轉爲
&#xxxxx;的格式?不知道asp/javascript有沒有相關的函數?就好比如IE瀏覽器可以很快就加載上萬字的&#xxxxx;格式的內容而不佔多少CPU。
回答:

已經自己搞定了!用escape函數轉換,然後把&u替換爲&#X即可。這樣就可以不使用到循環了。測試轉換1萬個字還沒有用1秒鐘,以前要用3分鐘。


貼出代碼給大家分享!這是實現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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章