本文目錄一覽:
- 1、java如何把string轉為utf-8
- 2、java中文亂碼,能說下string.getBytes()和new String()轉碼是,具體點。
- 3、Java中如何把GBK編碼的字符串轉成utf-8編碼
- 4、java爬蟲一段話里的部分字符亂碼解決
- 5、java 如何將「你好」轉成UTF-8 「\u4F60\u597D」 這種編碼
- 6、java使用property中文亂碼
java如何把string轉為utf-8
java不同編碼之間進行轉換,都需要使用unicode作為中轉。
String str = “任意字符串”;
str = new String(str.getBytes(“gbk”),”utf-8″);
備註說明:
str.getBytes(“UTF-8”); 意思是以UTF-8的編碼取得位元組
new String(XXX,”UTF-8″); 意思是以UTF-8的編碼生成字符串
舉例:
public static String getUTF8XMLString(String xml) {
// A StringBuffer Object
StringBuffer sb = new StringBuffer();
sb.append(xml);
String xmString = “”;
String xmlUTF8=””;
try {
xmString = new String(sb.toString().getBytes(“UTF-8”));
xmlUTF8 = URLEncoder.encode(xmString, “UTF-8”);
System.out.println(“utf-8 編碼:” + xmlUTF8) ;
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// return to String Formed
return xmlUTF8;
擴展資料:
UTF-8編碼規則:
如果只有一個位元組則其最高二進制位為0;如果是多位元組,其第一個位元組從最高位開始,連續的二進制位值為1的個數決定了其編碼的位元組數,其餘各位元組均以10開頭。
實際表示ASCII字符的UNICODE字符,將會編碼成1個位元組,並且UTF-8表示與ASCII字符表示是一樣的。所有其他的UNICODE字符轉化成UTF-8將需要至少2個位元組。每個位元組由一個換碼序列開始。第一個位元組由唯一的換碼序列,由n位連續的1加一位0組成,首位元組連續的1的個數表示字符編碼所需的位元組數。
Unicode轉換為UTF-8時,可以將Unicode二進制從低位往高位取出二進制數字,每次取6位,如上述的二進制就可以分別取出為如下示例所示的格式,前面按格式填補,不足8位用0填補。
參考資料來源:百度百科:UTF-8
java中文亂碼,能說下string.getBytes()和new String()轉碼是,具體點。
1、Java中,【String.getBytes(String decode)】的方法,會根據指定的decode,編碼返回某字符串在該編碼下的byte數組表示,例如:
byte[] b_gbk = “中”.getBytes(“GBK”);
byte[] b_utf8 = “中”.getBytes(“UTF-8”);
byte[] b_iso88591 = “中”.getBytes(“ISO8859-1”)
上面三行代碼表示:分別返回「中」這個漢字在GBK、UTF-8和ISO8859-1編碼下的byte數組表示,此時b_gbk的長度為2,b_utf8的長度為3,b_iso88591的長度為1。
2、而通過【new String(byte[], decode)】的方式來還原這個「中」字時,實際是使用decode指定的編碼來將byte[ ]解析成字符串,例如:
String s_gbk = new String(b_gbk,”GBK”);
String s_utf8 = new String(b_utf8,”UTF-8″);
String s_iso88591 = new String(b_iso88591,”ISO8859-1″);
s_gbk和s_utf8都是「中」,而只有s_iso88591是一個不認識 的字符,因為ISO8859-1編碼的編碼表中,根本就沒有包含漢字字符,當然也就無法通過”中”.getBytes(“ISO8859-1”)。
因此,通過【String.getBytes(String decode)】方法來得到byte[ ]時,要確定decode的編碼表中確實存在String表示的碼值,這樣得到的byte[ ]數組才能正確被還原。
擴展資料
java中文編碼避免亂碼
1、為了讓中文字符適應某些特殊要求(如http header頭要求其內容必須為iso8859-1編碼),可能會通過將中文字符按照位元組方式來編碼的情況,比如:
String s_iso88591 = new String(“中”.getBytes(“UTF-8″),”ISO8859-1”)
2、上述例子中的s_iso8859-1字符串實際是三個在 ISO8859-1中的字符,在將這些字符傳遞到目的地後,目的地程序再通過相反的方式:
String s_utf8 = new String(s_iso88591.getBytes(“ISO8859-1″),”UTF-8”)
來得到正確的中文漢字。這樣就既保證了遵守協 議規定、也支持中文。
3、String.getBytes(String decode)方法會根據指定的decode編碼返回某字符串在該編碼下的byte數組表示這裡是encode ,not decode,從字符串到位元組數組是編碼的過程,從位元組數組到字符串(即 new String(byte[] , charsetname))才是解碼的過程。
參考資料:百度百科-UTF-8
Java中如何把GBK編碼的字符串轉成utf-8編碼
我先解釋一下我對你的問題的理解 :
你的問題有點籠統 可以這麼理解兩個意思 : 一 ,你是想吧一個gbk編碼的字符串用utf-8格式來編碼
String s = new String (“全國”.getBytes(“GBK”),”GBK”);
雖然這個時候的s是GBK編碼的 但是s還是中文字符的 所以 上面這位同胞用 new(s.getBytes(“GBK”),”UTF-8″)的方式肯定是錯的 應該用 String s1 = new String (s.getBytes(“UTF-8″),”UTF-8”) 這樣s1就是UTF-8編碼的字符串了
二,如果是遇見亂碼問題 比如 String s = new String (“全國”.getBytes(“GBK”),”GBK”);
這樣的s就是gbk編碼的 現在你要把GBK格式的編碼用UTF-8去編碼 肯定就會出現亂碼
String s2 = new String(s.getBytes(“GBK”),”UTF-8″); 這個s2肯定是亂碼的 而且這樣就根本解不出來了 系統出現的亂碼顯示的時候才會出現編碼錯誤 所以 一般出現亂碼 只要把輸入流換個編碼解析一下就ok了 還有什麼不明白 可以問我
java爬蟲一段話里的部分字符亂碼解決
1. 網絡爬蟲亂碼的原因。
源網頁的編碼與抓取後的編碼轉換不一致。如果源網頁是gbk編碼的位元組流,程序在我們抓取後直接用utf-8編碼輸出到存儲文件,這必然會造成亂碼,即當源網頁編碼與程序抓取後直接處理編碼一致時,就不會出現亂碼,然後統一字符編碼後也就不會出現亂碼。注意區分源網絡代碼A,程序B直接使用的代碼,統一轉換字符的代碼C。
2. 是網頁的服務器端代碼。
B.捕獲的數據原本是位元組數組,由A編碼,只有B=A才能保證不會出現亂碼;否則,當字符集不兼容時,就會出現亂碼字符。這一步常用於測試。
c、統一轉碼是指在獲得網頁的原始編碼A後進行統一編碼,主要是將每個網頁的數據統一成一種編碼,往往首選字符集較大的utf-8。
每個網頁都有自己的代碼,比如gbk,utf-8,iso8859-1,日本jp系統代碼,西歐,俄語等等。爬行時,所有類型的代碼都將被擴展。有的爬蟲只是簡單的識別網頁,然後統一編碼,有的則直接按照utf-8統一處理,不需要判斷源網頁,顯然會造成亂碼。
3. 亂碼的解決方案。
根據原因找到解決辦法很簡單。
1) 確定源網頁的代碼a。
代碼a通常位於網頁的三個位置,即httpheader的內容、網頁的元字符集和網頁標題中的文檔定義。獲取源網頁代碼時,依次判斷這三部分數據,從頭到尾優先級相同。
理論上這是對的,但是國內有些網站不符合標準。比如寫出來的gbk其實是utf-8,有的寫出來是utf-8,其實是gbk。當然這是幾個網站,但是確實存在。因此,在確定網頁編碼時,應該對這種特殊情況給予特殊處理,如中文檢查、默認編碼等策略。
在另一種情況下,如果以上三種都沒有編碼信息,一般使用第三方的網頁編碼智能識別工具,如cpdetector。原理是通過統計位元組數組的特性來計算實際編碼,有一定的準確率,但是我發現在實踐中準確率還是很有限的。
但是綜合以上三種編碼確認方法後,中文亂碼的問題幾乎可以完全解決。在我的基於nutch1.6的網絡爬蟲系統中,經過統計,編碼準確率可以達到99.99%,這也證明了上述方法和策略的可行性。
2) 程序通過代碼b還原源網頁數據。
顯然,這裡的B應該等於a,在java中,如果源網頁的位元組數組是source_byte_array,就會轉換成stringstr=newstring(source_byte_array,B)。即這些位元組數組對應的字符被正確編碼顯示在內存中,此時打印結果正常。此步驟通常用於調試或控制台輸出測試。
3) 統一轉碼。
網絡爬蟲系統中有很多數據源。如果無法使用數據,它將被轉換為其原始數據,如果這樣做是浪費的。所以一般爬蟲系統要對抓取的結果進行統一編碼,做到一致,使用方便。此時,在(2)的基礎上,可以進行統一的編碼轉換,在java中的實現如下。
源網頁的位元組數組是source_byte_array。
轉換為普通字符串:stringnormal_source_str=newstring(source_byte_array,c)。這時候可以直接用javaapi存儲,但是字符串往往不直接寫。因為一般爬蟲存儲是將多個源網頁存儲在一個文件中,所以要記錄位元組偏移量,所以下一步。 再將得到的str轉換為統一的編碼C格式的位元組數組,則byte[] new_byte_array=normal_source_str.getBytes(C)即可,此時即可用java io api將數組寫入文件,並記錄相應的位元組數組偏移量等,待真正使用時,直接io讀取即可。
爬蟲過程不僅會存在亂碼問題,還會存在網站爬取涉及法律、IP受限,爬取行為受限等等問題,這個時候就需要不斷去解決這些問題。
java 如何將「你好」轉成UTF-8 「\u4F60\u597D」 這種編碼
這個是unicode碼,並不是UTF-8編碼,是統一碼,它為每種語言中的每個字符設定了統一併且唯一的二進制編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求。
處理方法如下
public static String toUnicode(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i s.length(); ++i) {
if (s.charAt(i) = 256) {
sb.append(“\\u00”);
} else {
sb.append(“\\u”);
}
sb.append(Integer.toHexString(s.charAt(i)));
}
return sb.toString();
}
public static void main(String[] args) {
String s = “你好”;
System.out.println(toUnicode(s));
}
java使用property中文亂碼
你的properties中的中文是經過 ascii轉碼的嗎?比如中文變成了這樣子: \u8be5\u8d44\u6e90\u7c7b\u578b\u5df2\u7ecf\u5b58\u5728\uff01
如果是,那麼只需要將讀到的字符串做一下轉碼即可。
你可以在String username=property.getProperty(“username”);之後,添加JAVA代碼也可以將亂碼轉為中文的。用如下語句就可以了,username =new String(username.getBytes(“ISO-8859-1″),”gbk”); 然後再用resultName就可以了,不過這樣的話你下面的String password=property.getProperty(“password”);
都慢慢的通過上面的java代碼去轉。
不知道你對反射熟悉不?如果熟悉的話可以通過反射機制去做轉碼就方便多了!
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/227418.html