我有一个应用程序,它始终没有问题。快进到今天:所有格式都被破坏了。基本上我正在向mysql数据库插入纯文本电子邮件,因为没有任何改变,已经工作了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,浏览器,服务器上发生了什么吗? (哦,由于这个原因,我也无法收到电子邮件。)
星期一的荣耀。
答案 0 :(得分:1)
“�”具有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),我们将这些转换为位模式:
第一个(110xxxxx)表示它是双字节字符中的第一个字节,从11000011 10101111
中剥离标记位会产生...00011 ..101111
或00000000 00000000 00000000 11101111
== {{1} }。
同样,接下来的两个会生成U+000000EF
或...00010 ..111111
。
然后U+000000BF
或...00010 ..111101
。
U+000000BD
U+00EF
U+00BF
(每https://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF)是“�”,这显然不对。
然而,这个答案 - https://stackoverflow.com/a/6544206/1105015 - 似乎提供了一些见解。 U+00BD
是“替换字符”EF BF BD
的UTF-8表示形式。所以它看起来像是某种方式上升了一个混淆你的系统的角色,它被存储为替换角色,然后最终重新渲染为latin-1。
我建议在这一点上仔细研究实际上是在插入db 时使用的编码。也许唯一改变的是用于此的MySQL客户端?
答案 1 :(得分:0)
数据库的(或表或列)编码或排序规则已经以某种方式进行了更改。如果要验证,请检查该列的编码,并将其与其他列的编码进行比较,而不会出现问题。
幸运的是,很容易将编码更改为正确的格式(在cPanel或PHPMyAdmin中),而无需更新实际数据。
我相信 latin1_swedish_ci 是默认排序规则,不会导致任何问题, utf-8 应该是编码。
希望这会有所帮助。
答案 2 :(得分: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