java中的UTF-8编码,从网站检索数据

java中的UTF-8编码,从网站检索数据,java,encoding,character-encoding,Java,Encoding,Character Encoding,我试图从UTF-8编码的网站获取数据,并将其插入数据库(MYSQL)。数据库也用UTF-8编码 这是我用来从特定站点下载数据的方法 public String download(String url) throws java.io.IOException { java.io.InputStream s = null; java.io.InputStreamReader r = null; StringBuilder content = new St

我试图从UTF-8编码的网站获取数据,并将其插入数据库(MYSQL)。数据库也用UTF-8编码

这是我用来从特定站点下载数据的方法

public String download(String url) throws java.io.IOException {
        java.io.InputStream s = null;
        java.io.InputStreamReader r = null;
        StringBuilder content = new StringBuilder();
        try {
            s = (java.io.InputStream)new URL(url).getContent();

            r = new java.io.InputStreamReader(s, "UTF-8");

            char[] buffer = new char[4*1024];
            int n = 0;
            while (n >= 0) {
                n = r.read(buffer, 0, buffer.length);
                if (n > 0) {
                    content.append(buffer, 0, n);
                }
            }
        }
        finally {
            if (r != null) r.close();
            if (s != null) s.close(); 
        }
        return content.toString();
    }
若编码设置为“UTF-8”(r=new java.io.InputStreamReader(s,“UTF-8”);),插入数据库的数据看起来是正常的,但当我试图显示它时,我得到了如下结果:C�科特迪瓦,而不是科特迪瓦

我所有的网站都用UTF-8编码

请帮忙

如果将encoding设置为“windows-1252”(r=new java.io.InputStreamReader(s,“windows-1252”);),一切正常,我在我的网站上看到了科特迪瓦(),但在java中,这个标题看起来像“科特迪瓦”,它破坏了其他东西,例如链接。这是什么意思

Java

如果您有一个servlet或jsp页面,那么问题似乎在于
HttpServletResponse
。确保将
HttpServletResponse
编码设置为UTF-8

在jsp页面或servlet的
doGet
doPost
中,在将任何内容发送到响应之前,只需执行以下操作:

response.setCharacterEncoding("UTF-8");
PHP


在PHP中,尝试在从数据库检索后使用该函数

>P>我会考虑使用Con IO,它们有你想做的功能:

即用以下内容替换代码:

public String download(String url) throws java.io.IOException {
    java.io.InputStream s = null;
    String content = null;
    try {
        s = (java.io.InputStream)new URL(url).getContent();
        content = IOUtils.toString(s, "UTF-8")

    }
    finally {
        if (s != null) s.close(); 
    }
    return content.toString();
}

如果没有,请开始研究是否可以将其正确存储到文件中,以消除数据库设置不正确的可能性。

您的服务器、客户端和连接的数据库编码是否都设置为UTF-8,并且是否使用该编码创建了表?选中“显示变量”和“显示创建表

若编码设置为“UTF-8”(r=new java.io.InputStreamReader(s,“UTF-8”);),插入数据库的数据看起来是正常的,但当我试图显示它时,我得到了如下结果:C�科特迪瓦,而不是科特迪瓦

因此,显示过程中的编码是错误的。你是如何展示它的?根据评论,这是一个PHP页面?如果是这样,那么您需要考虑两件事:

  • 使用相同的编码将它们写入HTTP响应输出,从而
    UTF-8
  • 将内容类型设置为
    UTF-8
    ,以便网络浏览器知道使用哪种编码来显示文本

  • 根据评论,你显然已经做了2个。在PHP中,您需要安装
    mb_string
    ,并将
    mbstring.http_output
    设置为
    UTF-8
    。我发现非常有用。

    我正在使用php/apache,是的,我将编码设置为UTF-8:header('Content-Type:text/html;charset=UTF-8');请注意,设置标头并不意味着设置编码。您应该在问题中指定您使用的是PHP/apache,因为您的java代码使其不明确。编写时也需要定义编码,但不知道这在PHP中是如何工作的,但是您在注释中设置的只是一个关于客户端应该如何解释内容流的说明。数据库编码:UTF-8 Unicode(utf8),所有表都是UTF-8格式(ENGINE=MyISAM DEFAULT CHARSET=utf8;)尝试使用commonsIO,而不是您在第一篇文章中所做的转换。这样做会得到一行字符。字符集客户端:utf8;字符集连接:utf8;字符集数据库:拉丁1;字符集文件系统:二进制;字符集结果:utf8;字符集服务器:latin1;字符集系统:utf8;好了,给你。您的服务器将数据存储为“latin1”(除非在创建表时专门设置了“utf8”。您还需要将服务器的“字符集”(实际上是字符编码,但现在不要讨论)设置为utf8。