我正在使用php将电子邮件内容文本作为UTF-8字符串插入到SQL Server 2008数据库表中,除了一个特定的电子邮件之外它工作正常。
INSERT命令失败并显示以下错误:
将查询字符串转换为UTF-16时发生错误:目标多字节代码页中不存在Unicode字符的映射。
导致它的文本是电话号码的扩展文本:
这个“xF7”应该是+ 91-98XXXXXXX(我添加了XX)必须变成UTF-16或其他东西?
在插入数据库之前,我使用mb_detect_encoding进行了UTF-8检查:
$HTMLencode = mb_detect_encoding(HTMLString, mb_detect_order(), true);
$ PLAINencode = mb_detect_encoding(PLAINString,mb_detect_order(),true);
你可以看到我甚至考虑了“多部分电子邮件” - HTML的一部分和PLAIN文本的一部分。 两个支票都返回 UTF-8 (这意味着“xF7”欺骗了我...... :)。
我也使用UTF-8 // IGNORE做了iconv()以忽略无效字符, 什么都没有帮助,我如何在PHP中解决这个问题?
上述代码适用于99%的电子邮件,但有一个特殊的电子邮件会引发此错误。
答案 0 :(得分:1)
0xF7
在Windows-1252中对÷
进行编码。您只是将数据直接传递给数据库吗?
您应该使用能够正确读取电子邮件标题的电子邮件库,其中说明了电子邮件中使用的字符编码。然后,在将文件交给您之前,理想情况下,该库会从该编码转换为UTF-8。
mb_detect_encoding
几乎没用,因为它只能访问字节,也不应用任何启发式方法。如果它为具有0xF7
的字符串提供UTF-8,则它无法以UTF-8显示