mysql换行符格式化

时间:2013-07-22 16:10:29

标签: php mysql character-encoding

我有一个应用程序,它始终没有问题。快进到今天:所有格式都被破坏了。基本上我正在向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,浏览器,服务器上发生了什么吗? (哦,由于这个原因,我也无法收到电子邮件。)

星期一的荣耀。

3 个答案:

答案 0 :(得分:1)

“�”具有latin-1iso-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

第一个(110xxxxx)表示它是双字节字符中的第一个字节,从11000011 10101111中剥离标记位会产生...00011 ..10111100000000 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