如何更改字符串编码?

Posted

技术标签:

【中文标题】如何更改字符串编码?【英文标题】:How do I change string encoding? 【发布时间】:2016-06-25 12:15:15 【问题描述】:

我有问题。我有一个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();
                            
                            finallytryinput.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;

【问题讨论】:

参考***.com/questions/5729806/encode-string-to-utf-8 你从哪里点击这个帖子请求一个 servlet 或一个 javascript/查询代码。? 【参考方案1】:

Java 中的字符串采用 UTF-16 格式。字节采用其他编码。字节通过网络发送。字符串不是。当您向网络发送字节时,使用 CharsetEncoder 获取所需编码中的字节,然后通过网络发送这些字节。您还没有展示实际通过网络发送数据的代码,因此不可能更精确。

【讨论】:

以上是关于如何更改字符串编码?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 UIWebView 中的字符编码?

提升读/写 XML 文件:如何更改字符编码?

mysql 更改数据库字符编码的方法

如何设置Mysql数据库默认的字符集编码为GBK

如何更改 ajax 字符集?

ruby 更改Rails 3.2.13和4.0如何在JSONMonkey修补程序ActiveSupport中编码unicode以恢复to_json unicode字符编码。