【问题标题】:utf-8 invisible charactersutf-8 不可见字符
【发布时间】:2012-06-09 03:32:26
【问题描述】:

我有一个网站,需要将文本字段中的数据存储到 mysql 数据库中。 前端是perl。我使用utf8::encode将数据编码为utf8。

向连接到 mysql db 并插入此文本的 Java 后端发出请求。 对于表,默认字符集设置为 utf8。 这在许多情况下有效,但在某些情况下会失败。

如果我使用テスト,则存储在数据库中的数据显示问号:ã??ã?¹ã??。 如果我尝试直接从 sql 浏览器插入 utf8 编码的字符串,一切正常。 更新事件集摘要 = ãã¹ã where event_id = 11657;

在插入时,我注意到 mysql 查询浏览器中出现了一些空白字符,例如:ã ã¹ ã。 从这里插入后,数据库中的数据显示数据库中的一些框而不是这些空格,并且テスト在utf8解码后正确显示在网站上。 问题是当我直接从网站插入时,这些特殊字符会在数据库中作为问号出现。

有人可以帮我处理这些特殊字符吗?我需要以不同的方式处理它们吗?

【问题讨论】:

  • 听起来数据流中的某个地方存在编码问题。如果不了解您的实际代码,很难说在哪里,但 Java 中的一个常见罪魁祸首是使用 String.getBytes()(没有编码参数)。另一种可能性是网页通信中的编码问题。
  • -1 否决providing code,实际上没有人可以reproduce the problem,并且所有答案(到目前为止4 个)都充满了假设。英文散文是代码的糟糕替代品。

标签: java mysql perl utf-8


【解决方案1】:

我们在其中一个项目中也遇到过类似的问题。所以我们不得不编写一个小程序将那些utf8 字符转换为html encoded 并存储到数据库中。

【讨论】:

    【解决方案2】:

    使用来自Apache Commons LangStringEscapeUtils

    import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
    // ...
    String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
    String escaped = escapeHtml(source);
    

    【讨论】:

      【解决方案3】:

      如果数据库真的存储了テスト,那你应该在sql浏览器中看到,而不是mojibake。

      听起来 Java 后端将 Perl 发送的内容解释为 ISO-8859-1 而不是 UTF-8。这解释了如何将 转换为\u00E3\u0083\u0086。然后后端尝试将数据发送到 Windows-1252 中的数据库 - MySQL 默认编码。不幸的是,Windows-1252 无法表示 \u0080-\u009F 范围内的 Unicode 字符,因此最后两个字符被问号替换。

      所以你有两个问题:

      1. 您应该让 Java 后端以 UTF-8 而不是 ISO-8859-1 格式读取请求。
      2. 后端与数据库通信时应使用 UTF-8。最简单的方法是将characterEncoding=utf8 添加到connection parameters

      【讨论】:

        【解决方案4】:

        我假设您正在发送 POST 参数。

        我认为您最初出现问题的最可能原因是以下原因之一:

        1. 如果参数是在 HTTP 请求正文中发送的,则您的 Perl 前端可能未在请求的内容类型标头中设置编码。网络服务器可能会假设 ISO-8859-1。解决方法是正确设置请求内容类型。

        2. 如果在 HTTP 请求 URL 中发送参数,则您的 Web 服务器在解码请求参数时使用了错误的字符集。这个问题的解决方案将是特定于网络服务器的......

        听起来在与数据库通信时也可能存在字符集问题,但这可能只是早期修改的结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-14
          • 2023-03-27
          • 2012-02-06
          • 1970-01-01
          • 1970-01-01
          • 2014-04-16
          • 2019-01-09
          相关资源
          最近更新 更多