2016-06-25 101 views
0

我有一個問題。我有一個String如何更改字符串編碼?

String str="Привет"; 

,我試圖通過一個POST請求發送到服務器。收到此字符串的網站有windows-1251字符集(服務器上的所有文件,數據,文本等都有windows-1251)。除了從我的Java應用程序收到的俄羅斯符號外,它顯示了其所有數據。我GOOGLE了這個問題,我怎麼能改變我的Java應用程序中的字符串編碼,但我仍然沒有解決方案。

我試圖做到這一點

String str=new String("Привет".getBytes("utf-8"),"cp1251"); 

,但沒有幫助。

所以,問題是:我該如何將Java utf-8串入cp1251使接受cp1251編碼Web服務器顯示了我正確地接收的所有數據。

這是我送的請求:

protected Map<String, String> getFromUrl(String url, boolean post, Map<String,String> postParams, Map<String,String> files, boolean options, String fbt, String asFile){ 
    dataStream=null; 
    bodyStream=null; 
    url=url.replaceAll("(?iu)^(http(s?)[://]*)+", "http$2://").replaceAll("(\\+|\\s+)", "%20"); 
    if(url.matches("(?iu)^https://.*$"))return getFromUrlSSL(url,post,postParams,files,options,fbt,asFile); 
    else if(!url.matches("(?iu)^((http(s?))|ftp)://.*$"))url="http://"+url; 
    if(url.length()>2048)url=url.substring(0,2048); 
    System.out.println("/*Trying to connect to "+url+"*/"); 
    Map<String, String> mp = new HashMap<String, String>(); 
    String host = this.getHostName(url), content = "", UA = this.getUA(), cookie = this.getCookie(host, UA), referer = "http://"+host+"/"; 
    try{ 
     mp.put("User-Agent",UA); 
     mp.put("cookies",cookie); 
     URL U = new URL(url); 
     HttpURLConnection conn = (HttpURLConnection)U.openConnection(); 
     conn.setInstanceFollowRedirects(false); 
     conn.setRequestProperty("Host", host); 
     conn.setRequestProperty("User-Agent", UA); 
     conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
     conn.setRequestProperty("Accept-Language", "ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3"); 
     conn.setRequestProperty("Accept-Encoding", "gzip,deflate"); 
     conn.setRequestProperty("Accept-Charset", "utf-8;q=0.7,*;q=0.7"); 
     conn.setRequestProperty("Keep-Alive", "115"); 
     conn.setRequestProperty("Connection", "keep-alive"); 
     if(arp!=null)for(Map.Entry<String, String> entry : arp.entrySet())conn.setRequestProperty(entry.getKey(),entry.getValue()); 
     if(referer != null&&(arp==null||!arp.containsKey("Referer")))conn.setRequestProperty("Referer", referer); 
     if(cookie != null && !cookie.contentEquals(""))conn.setRequestProperty("Cookie", cookie); 
     if(post&&(postParams!=null&&postParams.size()>0||files!=null&&files.size()>0)){ 
      if(!options)conn.setRequestMethod("POST"); 
      else conn.setRequestMethod("OPTIONS"); 
      conn.setDoOutput(true); 
      OutputStream os; 
      BufferedWriter writer; 
      if(files!=null&&files.size()>0){ 
       String boundary = Long.toHexString(System.currentTimeMillis()); 
       conn.setRequestProperty("Content-Type","multipart/form-data; boundary="+boundary); 

       os=conn.getOutputStream(); 
       writer=new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));; 
       if(postParams!=null&&postParams.size()>0){ 
        Iterator it=postParams.entrySet().iterator(); 
        while(it.hasNext()){ 
         Map.Entry<String,String> pair=(Map.Entry<String, String>)it.next(); 
         writer.append("--" + boundary).append("\r\n"); 
         writer.append("Content-Disposition: form-data; name=\""+pair.getKey()+"\"").append("\r\n"); 
         writer.append("\r\n"); 
         writer.append(pair.getValue()).append("\r\n"); 
        } 
       } 

       Iterator fIt=files.entrySet().iterator(); 
       while(fIt.hasNext())try{ 
        Map.Entry<String, String> fPair=(Map.Entry<String, String>)fIt.next(); 
        String filename=fPair.getValue(); 
        System.out.println("/*"+filename+"*/"); 
        if(!filename.matches("(?iu)^[\\s\\S]*?Content-Disposition. form-data[\\s\\S]*$")){ 
         File file=null; 
         System.out.println("/*"+filename+"*/"); 
         String fe=filename.matches("(?iu)^.*?(\\.[a-z0-9]{1,5})$")?filename.replaceAll("(?iu)^.*?(\\.[a-z0-9]{1,5})$","$1"):".jpg"; 
         if(filename.matches("(?iu)^(http|ftp).*$")){ 
          getFileFromUrl(filename,System.getProperty("user.dir")+"\\curFile"+fe); 
          file = new File(System.getProperty("user.dir")+"\\curFile"+fe); 
         } 
         else file = new File(filename); 
         try{ 
          BufferedImage bimg = ImageIO.read(file); 
          int width = bimg.getWidth(); 
          int height = bimg.getHeight(); 
          if(width<150||height<150)file=null; 
          else if(width/height>3||height/width>3)file=null; 
          else if(width>1024||height>1024){ 
           float ii=width/height,w=ii>0?1024:height/width*1024,h=ii>0?width/height*1024:1024; 
           int type = bimg.getType() == 0? BufferedImage.TYPE_INT_ARGB : bimg.getType(); 
           BufferedImage img = resizeImage(bimg,type,(int)w,(int)h); 
           ImageIO.write(img, "jpg", file); 
           if(filename.matches("(?iu)^(http|ftp).*$"))file = new File(System.getProperty("user.dir")+"\\curFile"+fe); 
           else new File(filename); 
          } 
         } 
         catch(Exception e){ 
          Error.showError("Browser.getFromUrl() can't get data from url",e); 
          return new HashMap<String,String>(){{put("error","fileerror");}}; 
         } 
         if(file!=null){ 
          writer.append("--" + boundary).append("\r\n"); 
          writer.append("Content-Disposition: form-data; name=\""+fPair.getKey()+"\"; filename=\""+file.getName()+"\"").append("\r\n"); 
          writer.append("Content-Type: application/octet-stream").append("\r\n"); 
          writer.append("\r\n").flush(); 
          InputStream input = new FileInputStream(file); 
          //System.out.println(conn.getOutputStream()); 
          try{ 
           byte[] buffer = new byte[1024]; 
           for(int length = 0;(length = input.read(buffer))>0;)os.write(buffer, 0, length); 
           os.flush(); 
          } 
          finally{try{input.close();}catch (IOException logOrIgnore){}} 
          writer.append("\r\n").flush(); 
         } 
        } 
       } 
       catch(Exception e){ 
        Error.showError("Browser.getFromUrl() can't get data from url",e); 
        return new HashMap<String,String>(){{put("error","fileerror");}}; 
       } 
       writer.append("--" + boundary + "--").append("\r\n"); 
      } 
      else{ 
       String params=""; 
       Iterator it=postParams.entrySet().iterator(); 
       while(it.hasNext()){ 
        Map.Entry<String,String> pair=(Map.Entry<String, String>)it.next(); 
        //System.out.println(pair.getKey()+"="+pair.getValue()); 
        /*if(pair.getKey().trim().contentEquals("")&&arp.get("Content-Type")!=null&&arp.get("Content-Type").matches("(?iu)^[\\s\\S]*?application/json[\\s\\S]$"))params+=pair.getValue(); 
        else */ 
        params+=URLEncoder.encode(pair.getKey(),"UTF-8")+"="+URLEncoder.encode(pair.getValue(),"UTF-8")+"&"; 
       } 
       params=params.replaceAll("&+$",""); 
       if(fbt!=null)conn.setRequestProperty("Content-Type",fbt); 
       os=conn.getOutputStream(); 
       writer=new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 
       if(fbt!=null){ 
        writer.append("Content-Type: "+fbt).append("\r\n"); 
        writer.append("Content-Length: "+params.length()).append("\r\n").append("\r\n"); 
        if(fbt.matches("(?iu)^.*boundary=.*$")){ 
         String boundary=fbt.replaceAll("(?iu)^[\\s\\S]*?boundary=([^;]+)[\\s\\S]*$","$1"); 
         writer.append(boundary).append("\r\n"); 
         it=postParams.entrySet().iterator(); 
         //System.out.println(boundary);System.exit(1); 
         while(it.hasNext()){ 
          Map.Entry<String,String> pair=(Map.Entry<String, String>)it.next(); 
          writer.append("Content-Disposition: form-data; name=\""+pair.getKey()+"\"").append("\r\n\r\n"); 
          writer.append(pair.getValue()).append("\r\n"); 
          writer.append(boundary).append("\r\n"); 
         } 
        } 
        else writer.append(params.replaceAll("(^[=&\\s])|([\\s=&]$)","")); 
       } 
       else writer.write(params.replaceAll("(^[=&\\s])|([\\s=&]$)","")); 
      } 
      writer.flush(); 
      writer.close(); 
      os.close(); 
      //System.out.println(conn.getOutputStream()); 
      conn.setConnectTimeout(120000); 
      conn.setReadTimeout(120000); 
     } 
     else{ 
      conn.setConnectTimeout(7000); 
      conn.setReadTimeout(7000); 
     } 
     conn.connect(); 
     //System.out.println(mp.get("cookies")); 
     mp = processResponseHeaders(conn.getHeaderFields()); 
     //System.out.println(mp.get("cookies")); 
     if(mp.get("cookies")!=null && !mp.get("cookies").trim().contentEquals("") && !mp.get("cookies").contentEquals(cookie))this.setCookie(host, UA, cookie+"; "+mp.get("cookies")); 
     if((needRedirect!=null&&!needRedirect.contentEquals("")) && curRedirect<5){ 
      if(!needRedirect.matches("(?i)^(.{3,5}?://)[\\s\\S]*$"))needRedirect = needRedirect.replaceAll("^([^\\.]*?://)?[^/\\?\\=\\&]*([/\\?\\=\\&])", url.replaceAll("^((http[s]?|ftp)://([^/\\?\\=\\&]*))[\\s\\S]*$","$1")+"$2"); 
      return getFromUrl(needRedirect,false,null,null,false,null,asFile); 
     } 
     try{ 
      dataStream = conn.getErrorStream() != null ? conn.getErrorStream() : conn.getInputStream(); 
      bodyStream = mp.get("content-encoding")!=null && mp.get("content-encoding").equalsIgnoreCase("gzip") ? new BufferedInputStream(new GZIPInputStream(dataStream)) : new BufferedInputStream(dataStream); 
      if(asFile!=null&&!asFile.trim().contentEquals(""))this.getFileFromUrlWIS(bodyStream,asFile); 
      else content = parseByteData(readToByteBuffer(bodyStream, 1024 * 1024), getCharsetFromContentType(conn.getContentType())); 
     } 
     catch(Exception e){Error.showError("Browser.getFromUrl() can't get data from url",e);} 
     finally{ 
      if(bodyStream != null)bodyStream.close(); 
      if(dataStream != null)dataStream.close(); 
     } 
     conn.disconnect(); 
    } 
    catch(Exception e){Error.showError("Browser.getFromUrl() can't get data from url",e);} 
    mp.put("url", url); 
    mp.put("content", content.replaceAll("&nbsp;", " ")/*.replaceAll("<!--[\\s\\S]*?-->", "")*/.replaceAll("[\r\n\t]","").replaceAll("\\s+", " ")); 
    curRedirect=0; 
    return mp; 
} 
+0

參考http://stackoverflow.com/questions/5729806/encode-string-to-utf-8 – lulyon

+0

從哪裏打這個帖子請求一個servlet或一個JavaScript /查詢代碼。 –

回答

0

字符串在Java中UTF-16。字節在其他編碼中。字節通過網絡發送。字符串不是。當您將字節發送到網絡時,使用CharsetEncoder來獲取所需編碼中的字節,然後通過網絡發送這些字節。你沒有顯示實際通過網絡發送數據的代碼,所以不可能更精確。