我有一个网站,需要将文本字段中的数据存储到mysql数据库中。
前端是perl。我使用utf8::encode
将数据编码为utf8。
请求连接到mysql数据库并插入此文本的Java后端。 对于表,默认字符集设置为utf8。 这在许多情况下都有效,但在某些情况下会失败。
如果我使用テスト
,则数据库中存储的数据会显示问号:ã??ã?¹ã??
。
如果我尝试直接从sql浏览器插入utf8编码的字符串,一切正常。
更新事件设置摘要= ãã¹ã
其中event_id = 11657
;
插入时我注意到mysql查询浏览器中出现了一些空白字符,如:ã ã¹ ã
。
从这里插入后,数据库中的数据显示数据库中的一些框而不是这些空格,并且在utf8解码后,テスト
在网站上正确显示。
问题是只有当我直接从网站插入时,这些特殊字符才会在数据库中显示为问号。
有人可以帮我这些特殊字符吗?我需要以不同方式处理它们吗?
答案 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字符,因此最后两个字符将被问号替换。
所以你有两个问题:
characterEncoding=utf8
添加到connection parameters。答案 3 :(得分:0)
我假设您正在发送POST参数。
我认为最初可能导致问题的原因之一是:
如果参数是在HTTP请求正文中发送的,则Perl前端可能没有在请求的内容类型标头中设置编码。网络服务器可能会假设ISO-8859-1。解决方案是正确设置请求内容类型。
如果参数是在HTTP请求URL中发送的,则在解码请求参数时,Web服务器使用了错误的字符集。对此的解决方案将是特定于Web服务器的......
听起来在与数据库交谈时可能还存在字符集问题,但这可能只是早期错位的结果。