【问题标题】:How do I recreate these special characters when testing a website?测试网站时如何重新创建这些特殊字符?
【发布时间】:2015-07-28 09:07:41
【问题描述】:

我们在英国网站上有一个“联系我们”表格,该表格会生成一封电子邮件。来自欧洲国家的一些用户正在输入公司名称,例如“Törner”和“Ómicron”,并且网站正在正确处理这些字符。像“João”这样的名字可以毫无问题地使用。

有时,我们会得到一个人的名字,或者看起来很疯狂的公司名称:

KovovÃÆ'ƒÆ’ÃÆ'†â€™ÃÆ'ƒâ€ ÃÆ'¢â‚¬â„¢ÃÆ'ƒÆ’€ ÃÆ'ƒÂ¢ÃÆ'¢â€šÂ¬ÃÆ'¢â₠¬Ã…¾Ã‚¢ÃÆ'Į €€ÆÆ’  ’ÃÆ'ƒÂ¢ÃÆ'¢â€šÂ ¬ÃƒÆ'…¡ÃÆ'ƒÆ’ÃÆ'¢â€šÂ¬Ã…¡ÃÆ'ĉۈ …¡ÃÆ'‚½roba 纳瓦兰尼

幸运的是,此人进行了第二次询问,这次文字只是:

科沃维罗巴·纳瓦兰尼

Google 透露在索尔瓦克有一个地方叫 Kovovýroba Navalaný。如果我尝试将其粘贴到我们的网站中,它可以正常工作。另一个问题来自德国,一个变音符号变成了数百个奇怪的字符。同样,我自己的测试没有问题。

我的问题是:如何重新创建似乎将单个字符气球变成 486 个乱码字符的输入?一旦我自己可以导致错误,我可以在我的代码中找到该位置我处理文本不好的地方。我已经粘贴了最狂野、最奇怪的土耳其语、俄语和中文字符,没有遇到任何问题。

【问题讨论】:

  • 这通常不应该发生,除非你正在做一些在某些情况下可能会出现问题的时髦字符处理。我知道没有可能导致这种怪异的标准流程。
  • 不做任何时髦的处理。奇怪的是,各种各样的口音、变音符号和非英语字母字母可以完好无损地保存下来……但是一两个客户能够输入除此之外的东西,这太疯狂了。
  • 我无法通过 escapeHTML 和编码解决。我也需要解决方案。

标签: html utf-8 internationalization


【解决方案1】:

当我在 PhpMyAdmin 中查看文本字段时,有时会得到这个字符串而不是撇号: ’

字段类型设置为文本,排序规则为utf8_general_ci。

在我的 xojo 应用程序中,我从 MSSQL 服务器检索文本,撇号显示为 ’。 (在 SQL 管理器中,撇号正常出现)。 我稍后将文本存储在 MySQL 中的上述字段中,结果如图所示。看起来像你的情况。

看起来字符转换正在从 ' 到 ’ 到 ’ 复合。 这并不能解释其原因,但它确实为您提供了重现该效果的途径。

【讨论】:

    【解决方案2】:

    @MagnusSmith 在从现场获取测试时,您可能想尝试直接定义编码。

    请记住,Xojo 中的字符串不一定有定义的编码。您可以使用String.Encoding 对其进行测试,然后分别使用String.ConvertEncodingString.DefineEncoding 对其进行转换或定义。

    【讨论】:

      【解决方案3】:

      似乎正在发生的是 utf8 字节被解释为 latin1 字符,然后转换为 utf8。重复多次次。

      由于 MySQL 的错误配置,我经常看到这种情况发生两次,但从来没有这样的情况发生过。在艾伦的例子中:

      ’     E28099
      ’     C3A2 E282AC E284A2
      ’  C383C2A2C3A2E2809AC2ACC3A2E2809EC2A2
      ’
      

      在原来的问题中:

      ý        C3BD
      ý       C383 C2BD
      ý     C383 C692 C382 C2BD
      ý C383 C692 C386 E28099 C383 E2809A C382 C2BD
      (etc)
      

      (至于什么进程反复做坏事,我不知道。)

      至于撤销契约。下面是使用 MySQL 撤消一步的示例:

      SELECT CONVERT(BINARY(CONVERT('ý' USING latin1)) USING utf8mb4)
                                --> 'ý'
      

      (我没有“循环直到完成”的好方法。)

      至于为什么有些字符可以,有些不行,我没有看到规律。

      ãöÓ 可以吗?但是ý’ 不好?有趣的是ãöÓ 有 latin5 编码,但其他两个没有。 (唉,这与有用的模式相反。)

      Magnus - 会不会像 Allan 所暗示的那样,字符串被反复提取和存储?

      【讨论】:

      • 感谢您的回复。当我的网页所做的只是获取键入的值并将它们传递给 SQL 存储过程以保存一次时,我看不到这可能是如何循环的。但是你给了我很多很好的线索让我进一步研究!
      • @MagnusSmith - 创建存储过程时,会捕获当前字符集。与SHOW CREATE PROCEDURE ... 核对如果它显示“latin1”,那可能是一个强有力的线索。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      相关资源
      最近更新 更多