utf-8隐形字符

时间:2012-06-05 05:00:47

标签: java mysql perl utf-8

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

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

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

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

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

4 个答案:

答案 0 :(得分:0)

我们在其中一个项目中也遇到了类似的问题。因此我们必须编写一个小例程将这些utf8字符转换为html encoded并存储到数据库中。

答案 1 :(得分:0)

使用StringEscapeUtils中的Apache Commons Lang

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);

答案 2 :(得分:0)

如果数据库确实存储了テスト,那就是你应该在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

答案 3 :(得分:0)

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

我认为最初可能导致问题的原因之一是:

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

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

  3. 听起来在与数据库交谈时可能还存在字符集问题,但这可能只是早期错位的结果。