【问题标题】:insert UTF-8 characters into sql server 2008 table将 UTF-8 字符插入 sql server 2008 表
【发布时间】:2023-03-04 19:19:01
【问题描述】:

我正在使用 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 的一部分和纯文本的一部分。 两项检查都返回 UTF-8 (这意味着“xF7”愚弄了我.. :))

我还使用 UTF-8//IGNORE 做了 iconv() 以忽略无效字符, 没有任何帮助,我该如何在 php 中解决这个问题?

上述代码适用于 99% 的电子邮件,除了一封引发此错误的特殊电子邮件。

【问题讨论】:

    标签: php sql-server-2008 encoding utf-8


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我不是直截了当,我在插入之前这样做:$PLAINText = iconv("UTF-8","UTF-8//IGNORE",$PLAINText); .有很多帖子建议它,但它对我不起作用,还有其他人没有为他们清除无效字符......
    • @Rodniko 我猜你不明白。这些小技巧是完整的,您需要做的就是阅读电子邮件标题并使用电子邮件标题中声明的编码来解码电子邮件。因为黑客是 bs,所以您 正在 将电子邮件直接传递给 insert。
    猜你喜欢
    • 2015-08-09
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 2017-05-14
    相关资源
    最近更新 更多