本文目錄一覽:
JAVA 在抓取網頁 怎麼自動識別它的網頁編碼
JAVA 在抓取網頁 怎麼自動識別它的網頁編碼
1. 看HttpHeader裡面是否有一定的encoding; 或者看HTML頁面頁面的encoding
meta http-equiv=”Content-Language” content=”zh-CN” /
meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /
2. 如果沒拋異常, socket就認為只是一直等待, 不知道是否可以設置超時時間, socket肯定是可以的
java中編碼與解碼分別指什麼?
java中編碼:URLEncoder.encode(strUri,”utf-8″);
java中解碼碼:URLDecoder.decode(strUri,”utf-8″);
java編碼和解碼
流讀取文件,具有轉換編碼功能的有:OutputStreamWriter和InputStreamReader,
構造器有如:
InputStreamReader(InputStream in, String charsetName)
創建使用指定字符集的 InputStreamReader。
OutputStreamWriter(OutputStream out, String charsetName)
創建使用指定字符集的 OutputStreamWriter。
處理字符串編碼問題:
重新對獲取的字符串進行編碼:Byte[] bytes = str.getBytes(String encodeCharsetNam);
重新對bytes進行解碼,創建新的字符串對象:str = new String(Byte[] bytes,String decodeCharsetName);
一般結合使用:str = new String(str.getBytes(String encodeCharsetName),String decodeCharsetName);
例如:resultName=new String(username.getBytes(“ISO-8859-1″),”UTF-8”);
還可以加入判斷:
if(!Charset.forName(“gbk”).newEncoder().canEncode(str)){str = new Strin(str.getBytes(“ISO-8859-1″),”UTF-8”);}else{str = new String(str.getBytes(“ISO-8859-1″),”gbk”);}
處理請求參數傳遞編碼問題:
java中編碼:URLEncoder.encode(strUri,”utf-8″);
java中解碼碼:URLDecoder.decode(strUri,”utf-8″);
js中編碼:encodeURIComponent(strUri);encodeURI(strUri);escape(str);
js中解碼:decodeURIComponent(strUri);decodeURI(strUri);unescape(str);
補充概念:
URI組件:主機、端口、路徑、查詢參數、片段等。
URI組件分隔符::/?#[]@,冒號用於分隔協議和主機,/用於分隔主機和 路徑,?用於分隔路徑和查詢參數,用於分隔多個查詢參數等。
URI中的不安全字符或保留字符: ! * ‘ ( ) ; : @ = + $ , / ? # [ ] 他們具有特殊作用,例如上面的分隔作用。
URI允許出現的字符:只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及所有保留字符,其他字符均需要經過編碼之後才能出現在Url中,比如使用保留字符的原意,而不是特殊作用。
js向java/jsp的編碼與解碼:
js中編碼:encodeURI(encodeURI(strUri));decodeURIComponent(decodeURIComponent(strUri));
java/jsp中解碼: java.net.URLDecoder.decode(strUri,”UTF-8″);
js中編碼兩次的問題:如果使用一次編碼,在瀏覽器地址欄里,瀏覽器認為%是個轉義字符,瀏覽器會把%與%之間的編碼值,兩位兩位取出後進行解碼。
然後再傳遞給處理頁面,然後由處理頁面進行再次解碼,這樣前面就缺少了一次編碼過程,所以前面需要連續兩次編碼。
幾種判斷字符集編碼的方法(Java) 未完
如果是Java的String對象的話,則一定是Unicode的,這個沒有為什麼,Java就是這麼定的。
我猜你的問題應該是如何判斷一段字節流是什麼編碼類型,對嗎?比如一個文件,或是網絡上面取下來的一段Byte數組,你需要用一個合適的編碼來解析成字符串。
這個讓你失望了,沒有一個文檔化的,確定的方法來判斷,只能用測試的方法,這個方法也只是猜測,不能百分百的確定,方法如下:
用常見的編碼方式對字節流進行解碼,比如Unicode,UTF8, UTF8 without BOM, UTF16, ANSI等等。
對解析的結果進行判斷,是不是一個合理的可打印字符,可打印字符最多的解碼方式就是最可能的編碼了。
如何判斷可打印字符?流程如下:把解析好的字符串按照字符進行遍歷,把每一個字符轉化成Unicode編碼,看看這些編碼是不是Unicode的支持範圍極客。
如果發現有種編碼方式都是可打印字符,那麼再使用本步驟:對字符串進行分詞,分詞這個在此不作贅述,你自己再研究一下。分詞效果好的就是最可能的編碼了。(不過通常到第三步就能搞定了,第四部絕大部分用不着)
Java: 如何知道一個字符串當前是什麼字符集?
判斷java字符串的字符集有多種方法,我們一一討論如下:
1、通過把未知編碼字符串,用猜想的編碼再解碼,觀察字符串是不是正確還原了。
原理:假如目標編碼沒有數組中的字符,那麼編碼會破壞,無法還原。
缺點:假如字符少,而正巧錯誤的猜想編碼中有這種字節,就會出錯。
如:new String(“tested str”.getBytes(“enc”),”enc”)
2、大多數時候,我們只要判斷本地平台編碼和utf8,utf8編碼相當有規律,所以可以分析是否是utf8,否則使用本地編碼。
原理:分析byte[]來判斷規律。
缺點:有時,個別本地編碼字節在utf8中也會出現,導致出錯,需要分析。
如:判斷是否utf-8代碼:
public static boolean isValidUtf8(byte[] b,int aMaxCount){
int lLen=b.length,lCharCount=0;
for(int i=0;i
byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;)
if(lByte=0) continue;//=0 is normal ascii
if(lByte(byte)0xc0 || lByte(byte)0xfd) return false;
int lCount=lByte(byte)0xfc?5:lByte(byte)0xf8?4
:lByte(byte)0xf0?3:lByte(byte)0xe0?2:1;
if(i+lCountlLen) return false;
for(int j=0;j=(byte)0xc0) return false;
}
return true;
}
3.按編碼規則,一字字比照。
優點是錯物更少,缺點是太費資源。
原創文章,作者:JBPR,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/146991.html