1

我有一个应用程序一直没有问题。快进到今天:所有格式都被破坏了。基本上我正在向 mysql db 插入纯文本电子邮件,这已经工作了 5 年以上,因为没有任何改变。在我的 php 代码中,纯文本如下所示:

hello [name],

How are you?

This is a test.

Thank you.

Ceo

今天我查看了包含电子邮件的相同 php 代码,所以它只是坐在那里,就像一个文件。然后我查看一直在数据库中的电子邮件的现有纯文本,它们看起来都像这样:

hello [name],\r\n\r\n�How are you?\r\n\r\n�This is a test.\r\n\r\n�Thank you.\r\n\r\n�
Ceo

现在,在我把头发全部拿出来之前,你们都知道mysql db、浏览器、服务器上发生了什么吗?(哦,因此,我也无法收到电子邮件。)

星期一的荣耀。

4

3 回答 3

3

"�" 具有latin-1( iso-8859-1) 中的以下字符:

   303  195  C3    Ã    LATIN CAPITAL LETTER A WITH TILDE
   257  175  AF    ¯    MACRON
   302  194  C2    Â    LATIN CAPITAL LETTER A WITH CIRCUMFLEX
   277  191  BF    ¿    INVERTED QUESTION MARK
   275  189  BD    ½    VULGAR FRACTION ONE HALF

字节序列为,则C3 AF C2 BF C2 BD。这“闻起来”像 UTF-8。解码(根据https://en.wikipedia.org/wiki/UTF-8),我们将它们转换为位模式:

  • 11000011
  • 10101111
  • 11000010
  • 10111111
  • 11000010
  • 10111101

第一个 (110xxxxxx) 表示它是两字节字符中的第一个字节,并从11000011 10101111yield...00011 ..10111100000000 00000000 00000000 11101111==中剥离标记位U+000000EF

同样,接下来的两个 make ...00010 ..111111or U+000000BF

然后...00010 ..111101U+000000BD

U+00EF U+00BF U+00BD(根据https://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF)是“�”,这显然是不对的。

然而,这个答案——https ://stackoverflow.com/a/6544206/1105015——似乎提供了一些见解。EF BF BD是“替换字符”的 UTF-8 表示U+FFFD。因此,看起来有些东西让您的系统感到困惑,它被存储为替换字符,然后最终重新渲染为 latin-1。

我建议在这一点上仔细查看实际上是您在插入 db 时使用的编码。也许唯一改变的是用于此的 MySQL 客户端?

于 2013-07-22T16:50:02.563 回答
0

好的,所以我尝试使用这个 mysql_real_escape_string

现在我的电子邮件看起来像这样:

hello [name],\\n\\nHow are you?\\n\\nThis is a test.\\n\\nThank you.\\n\\nCeo

它添加了额外的斜线。

我的 html/php 代码如下所示:

hello [name],\n\n

How are you?\n\n

This is a test.\n\n

Thank you.\n\n

Ceo
于 2013-07-22T18:51:52.783 回答
0

数据库(或表或列)的编码或排序规则已以某种方式更改。如果要验证,请检查该列的编码,并将其与其他列的编码进行比较,没有问题。
幸运的是,很容易将编码更改为正确的格式(在 cPanel 或 PHPMyAdmin 中),而无需更新实际数据。

我相信latin1_swedish_ci是没有问题的默认排序规则, utf-8应该是编码。

希望这可以帮助。

于 2013-07-22T17:12:35.407 回答