我们在英国网站上有一个“联系我们”表格,可以生成一封电子邮件。来自欧洲国家的一些用户正在输入公司名称,例如“Törner”和“Ómicron”,该网站正在正确处理这些字符。像“João”这样的名字没有任何问题。
偶尔,我们会得到一个看起来很疯狂的人名或公司名称:
KovovÃÆ'Æ•••••†Ã¢â‚¬ââ€ZA¢ÃƒÆ'ƒâ€Ã, ÃÆ'Ã,¢Ã¢ââ,¬Å¡Ã,¬Ã¢¢?â,¬Å¾Ã,¢ÃÆ'ƒÀ â€央行“¢ÃƒÆ'Ã,¢Ã¢â€â,¬Å¡Ã,¬ÃâšÃ, ÃÆ'ƒÀšÃ,¢ÃÆ'Ã,¢Ã¢â‚¬Ã...¡Ã‚Ã,¬ÃÆ'Ã,¢Ã¢ââ€SA ¬A...¾Ã‚Ã,¢ÃÆ'ƒÀ â€央行“¢ÃƒÆ'â€央行 â€ââ€ZA¢ÃƒÆ'ƒÀšÃ,¢ÃÆ'Ã,¢Ã¢â‚¬Ã...¡Ã‚Ã, ¬ÃƒÆ'â€â,¬Â|Ã↚Ã,¡ÃÆ'Ã’À â€央行“¢ÃƒÆ'Ã,¢Ã¢â€â,¬Å¡Ã,¬Ãâ†|Ã,¡ÃÆ'ÃՉۈ ...¡ÃÆ'â€â,¬Å¡ÃƒâšÃ,½roba Navalany
幸运的是,这个人进行了第二次调查,这次文本只是:
kovovyroba Navalany
谷歌透露,索尔维亚有一个名叫KovovýrobaNavalaný的地方。如果我尝试将其粘贴到我们的网站,它可以正常工作。另一个问题来自德国,其中一个变音符号变成了数百个奇怪的字符。再次,我自己的测试没有问题。
我的问题是:我如何重新创建输入,这似乎会将单个字符气球变成486个字符的乱码?一旦我可以自己导致错误,我可以在我的代码中找到该位置我在哪里处理文本很糟糕。我用最疯狂,最奇怪的土耳其语,俄语和汉字粘贴,没有任何问题。
答案 0 :(得分:1)
当我在PhpMyAdmin中查看文本字段时,有时会得到此字符串而不是撇号: Ã⢢‚¬â„¢¢p
字段类型设置为文本,排序规则为utf8_general_ci。
在我的xojo应用程序中,我从MSSQL服务器检索文本,并且撇号显示为’。 (在SQL管理器中,撇号正常显示)。 稍后,我将文本存储在MySQL的上述字段中,结果如图所示。看起来像您的情况。
看起来字符转换正从'到’到ƒƒ¢¢¢¢â€šÂ¬Ã¢â€ž¢¢复合。 这并不能解释其原因,但确实为您提供了重现效果的途径。
答案 1 :(得分:1)
@MagnusSmith从现场获取测试时,您可能想尝试完全定义编码。
请记住,Xojo中的字符串不一定已定义编码。您可以使用String.Encoding对其进行测试,然后分别使用String.ConvertEncoding或String.DefineEncoding对其进行转换或定义。
答案 2 :(得分:0)
似乎正在发生的事情是,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中具有编码,而其他两个则没有。 (A,这与有用的模式相反。)
Magnus-难道是像Allan所建议的那样,重复提取并再次存储了字符串吗?