java字符集編碼的自動識別(字符需要編碼機器才能識別)

本文目錄一覽:

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-hk/n/146991.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
JBPR的頭像JBPR
上一篇 2024-10-31 15:33
下一篇 2024-10-31 15:34

相關推薦

  • 英語年齡用連字符號(Hyphenation for English Age)

    英語年齡通常使用連字符號表示,比如 “five-year-old boy”。本文將從多個方面探討英語年齡的連字符使用問題。 一、英語年齡的表達方式 英語中表…

    編程 2025-04-29
  • Python字符轉列表指南

    Python是一個極為流行的腳本語言,在數據處理、數據分析、人工智能等領域廣泛應用。在很多場景下需要將字符串轉換為列表,以便於操作和處理,本篇文章將從多個方面對Python字符轉列…

    編程 2025-04-29
  • Python學習筆記:去除字符串最後一個字符的方法

    本文將從多個方面詳細闡述如何通過Python去除字符串最後一個字符,包括使用切片、pop()、刪除、替換等方法來實現。 一、字符串切片 在Python中,可以通過字符串切片的方式來…

    編程 2025-04-29
  • Python計算中文字符個數

    本文將從多個方面對Python計算中文字符個數進行詳細的闡述,包括字符串長度計算、正則表達式統計和模塊使用方法等內容。 一、字符串長度計算 在Python中,計算字符串長度是非常容…

    編程 2025-04-29
  • Python中如何判斷字符為數字

    判斷字符是否為數字是Python編程中常見的需求,本文將從多個方面詳細闡述如何使用Python進行字符判斷。 一、isdigit()函數判斷字符是否為數字 Python中可以使用i…

    編程 2025-04-29
  • Python中逗號算字符嗎

    Python中逗號既可以作為分隔符,也可以作為一個表達式中的運算符。關於逗號作為分隔符是不會被算作字符的事情,這點大家都知道。本文主要就是闡述逗號作為運算符在表達式中是會被算作字符…

    編程 2025-04-28
  • 使用boofcv進行圖像處理和機器視覺

    本文將詳細介紹使用boofcv進行圖像處理和機器視覺的方法和實踐。首先,我們將介紹boofcv的概述和安裝方法,然後分別介紹它的圖像處理、相機校準和機器學習功能。 一、概述和安裝 …

    編程 2025-04-28
  • 從16進制轉義到中文字符

    16進制轉義是為了在不同的字符集、不同的編碼下,能夠保證特殊字符被正確的識別和渲染。本文將從多個方面對16進制轉義做詳細的闡述,讓讀者對其有更深入的了解。 一、轉義實現 在Web開…

    編程 2025-04-28
  • python字符轉換成位元組的方法

    Python是一種很流行的編程語言,它支持多種數據類型的操作和轉換。在實際應用中,我們經常需要把字符轉換成位元組來進行網絡傳輸或者文件讀取等操作。Python提供了很多方法可以完成這…

    編程 2025-04-28
  • 如何使用字符常量輸出hello

    在本篇文章中,我們將從以下幾個方面詳細討論如何使用字符常量輸出hello。通過簡單的代碼示例,希望能夠幫助您更好地理解和掌握。 一、輸出字符常量 首先,我們需要了解在編程中如何使用…

    編程 2025-04-27

發表回復

登錄後才能評論