1

我正在使用 php 将电子邮件内容文本作为 UTF-8 字符串插入到 SQL Server 2008 数据库表中,除了一封特定的电子邮件外,它工作正常。

INSERT 命令失败并出现以下错误:

将查询字符串转换为 UTF-16 时出错:目标多字节代码页中不存在 Unicode 字符的映射。

导致它的文本是电话号码的分机文本:

在此处输入图像描述

这个应该是+91-98XXXXXXX(我加了XX)的“xF7”一定变成了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% 的电子邮件,除了一封引发此错误的特殊电子邮件。

4

1 回答 1

1

0xF7÷在 Windows-1252 中编码。您只是将数据直接传递到数据库吗?

您应该使用正确读取电子邮件标头的电子邮件库,其中说明了电子邮件中使用的字符编码。然后,该库会理想地从该编码转换为 UTF-8,然后再将其交给您。

mb_detect_encoding几乎没有用,因为它只能访问字节并且也不应用任何启发式方法。如果它为具有 的字符串提供 UTF-8 则尤其无用,而该字符串0xF7不能出现在 UTF-8 中

于 2013-04-10T21:38:58.050 回答