【问题标题】:Converting ASCII value in the middle of a string在字符串中间转换 ASCII 值
【发布时间】:2019-01-21 14:02:32
【问题描述】:

我有一个 PHP 脚本,可以将值从网上商店存储到 MySQL 数据库。该商店允许客户留言,当他们使用表情符号时可能会造成严重破坏。为了防止这些字符破坏我的脚本,我在所有字符串上使用了FILTER_SANITIZE_STRINGFILTER_FLAG_STRIP_HIGH,然后将它们全部发送到 MySQL。

这很好用,除了当我在我编写的 Java 程序中再次显示它时,我会使用 "I'm" 而不是 "I'm"

有没有办法让 Java 找到 ASCII 值并将其转换回字符?

我目前的攻击计划是有一个函数,它获取每个相关的字符串列,检查每个单词以查找 &#,找到 &# 之后的分号位置,用相应的 ASCII 替换该值字符,并返回新的字符串。

这是可行的,但我希望有一种现有的方法可以做到这一点,而无需重新发明轮子。

编辑:感谢@rzwitserloot 为我指明了正确的方向,对于任何看到这个但没有在他的回答中阅读我的评论的人,我最终使用了JSoup。以下是 Java 端与此相关的最终代码部分的 sn-p,供其他人使用:

// Connect method opens a connection to the MySQL server 
connect();
// Query the MySQL server 
resultSet = statement.executeQuery("select * from order_tracking order by DateOrdered");

// If there is any result, iterate through them until the end is reached. 
while (resultSet.next()) { 
  // Add each returned row into the list to send to the table
  Jsoup.parse(resultSet.getString(2)).text()
.
.
.
}

Jsoup.parse(String) 末尾的.text() 摆脱了 Jsoup 自动抛出的 html 格式(即<Head><Body> 等),并仅返回带有& 的文本部分(或任何 ascii 值)可能)格式正确。

谢谢!

【问题讨论】:

  • 看到这个answer 看起来编码是可选的所以也许不这样做?
  • 你的数据库的字符集是什么?如果您使用utf8mb4,您也应该能够存储表情符号。如果那是正确的字符集,您可能需要使用参数化查询
  • @user3783243 我的数据库的字符集是 utf8_general_ci。我目前正在使用参数化查询。
  • 您看到的是"I&#39m" 还是"I'm"?也就是说,您在问题中是否遗漏了分号,还是缺少分号?
  • @ScaryWombat,当我不过滤掉表情符号时,插入命令会失败。我会查看您提供的链接

标签: java php mysql ascii


【解决方案1】:

最好的解决方案是只修复初始位:当然数据库(和一般的 mysql)可以存储表情符号,但 mysql 很奇怪。 utf8 不是 utf8,它的名称错误。 mysql中真正的utf8叫做utf8mb4。使用该编码,您可以很好地存储笑脸。

如果该选项对您不起作用,则您的字符串是 HTML 编码的。解决方案是对它们进行 HTML 解码。 Java 没有开箱即用,您需要一个依赖项。有这个,例如:http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/StringEscapeUtils.html#unescapeHtml4(java.lang.String)

【讨论】:

  • 不幸的是,PHP 端的代码非常广泛,使用 utf8mb4 并摆脱 FILTER_SANITIZE_STRING 将是一项艰巨的任务。因此,即使我认为更改数据库是最正确的操作,我也必须走 HTML 解码路线。我已经通过在 Java 端的一行上使用 JSoup (jsoup.org) 解决了这个问题。谢谢!
【解决方案2】:

您的数据库中有 HTML 转义的实体。这并不理想,但很容易逆转。将字符串传递给html_entity_decode() 以反转此过程。

【讨论】:

  • 我会记住 html_entity_decode() 如果我必须在 PHP 中的某个时间点反转它。但是,对于这个问题,我需要用 Java 对其进行解码。我最终使用了 Jsoup,因为它让我在我的 Java 程序中用一行代码解决了这个问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 2013-09-27
  • 2011-02-11
  • 1970-01-01
相关资源
最近更新 更多