鍍金池/ 問答/Java  C++  HTML/ java 編碼轉(zhuǎn)換(已解決,轉(zhuǎn)換字節(jié)丟失,無法實現(xiàn))

java 編碼轉(zhuǎn)換(已解決,轉(zhuǎn)換字節(jié)丟失,無法實現(xiàn))

        String url = "http://hk.azero-ng.cn/index2.php";
        URL obj = new URL(url);
        URLConnection conn = obj.openConnection();
        Map<String, List<String>> map = conn.getHeaderFields();
        
        
        
        String filename = map.get("Content-Disposition").get(0);
        String Wrong_utf8 = new String(filename.getBytes("latin1"),"utf8");
        

代碼如上,請問如何在已知Wrong_utf8的情況下,重新得到 filename?

String filename_wrong = 
new  String(android.getBytes("utf8"),"latin1")//這樣是不行的

之所以一定要這么轉(zhuǎn)換

是因為
在安卓中的urlconnection 由okhttp底層實現(xiàn),okhttp默認將header,utf8編碼返回
如圖
源碼
圖片描述
結(jié)果
圖片描述
這樣,pc端的正確做法

new String(filename.getBytes("ISO-8859-1"),"GBK")

就失效了

最終結(jié)論

參考
http://blog.csdn.net/54powerm...

回答
編輯回答
莓森

Header里面的Content-Disposition只支持ASCII,所以我們傳輸?shù)奈募仨毷茿SCII,當文件名為中文時,必須要將該中文轉(zhuǎn)換成ASCII。

如果服務(wù)端能處理,最好直接將filename通過URLEncode編碼。

根據(jù)你提供的代碼,你服務(wù)端返回的數(shù)據(jù)實際是GBK編碼,可參考以下代碼是可以獲取到正確名稱:

String url = "http://hk.azero-ng.cn/index2.php";
        URL obj = new URL(url);
        URLConnection conn = obj.openConnection();
        Map<String, List<String>> map = conn.getHeaderFields();

        String[] cells = map.get("Content-Disposition").get(0).split(";");
        String filename = cells[1].replace(" filename=", "");
        System.out.println(filename);

        String Wrong_utf8 = new String(filename.getBytes("ISO-8859-1"),"GBK");

        System.out.println(Wrong_utf8);

建議服務(wù)端直接名稱URLEncode編碼即可,

參考: http://blog.csdn.net/liuyaqi1...

2018年1月13日 23:59
編輯回答
命多硬

你打下log看下,感覺沒什么問題?另外有UnsupportedEncodingException 異常你處理了沒?

2018年1月1日 19:24