如何更改字符串编码?

时间:2016-06-25 12:15:16

标签: java encoding character-encoding

我有问题。我有String

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

我尝试通过POST请求发送到服务器。收到此字符串的网站有windows-1251字符集(在服务器上所有文件,数据,文本等都有windows-1251)。它显示了所有数据,除了从我的Java应用程序收到的俄语符号。我搜索了这个问题,如何在我的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;
}

1 个答案:

答案 0 :(得分:0)

字符串在Java中是UTF-16。字节在其他编码中。字节通过网络发送。字符串不是。当您向网络发送字节时,使用CharsetEncoder获取所需编码的字节,并通过网络发送。您还没有显示实际通过网络发送数据的代码,因此无法更精确。