UTF8与Latin1

时间:2015-12-07 19:35:54

标签: php mysql utf-8

我试图理解Latin1和UTF8之间的区别,但大多数情况下我得到它,但是,在测试时我得到了一些奇怪的结果并且可以使用一些帮助澄清

我正在测试'é'(带有急性的拉丁文小写字母E),下面的链接显示了十六进制c3a9

我设置了一个数据库,并指定了utf8作为字符集,然后创建了一个以utf8作为字符集的表,并在将连接和客户端字符集设置为UTF8之后插入了带有字符'é'的记录

当我选择hex(字段)时,test_table中的字段得到:

十六进制(字段),字段 C3A9,é

这很好,与我读到的一致,但是,当我使用latin1字符集完全相同时,我得到以下内容:

十六进制(字段),字段 C3A9,é

但如果我输入char(x'E9'),它应该是é的单字节Latin1等效值我设法使用'set names UTF8'正确显示它但是在设置时它没有正确显示连接和客户端到Latin1

任何人都可以澄清吗? - 在UTF8和Latin1中,Latin1字符不应该是单字节(Hex E9)吗?还是我完全误解了一切?

谢谢

2 个答案:

答案 0 :(得分:2)

在最近通过手指UTF-8推出网站后,我认为这是在UTF-8编码页面或终端内的latin1表中查看UTF-8数据的情况。

如果您使用终端,可以通过查看终端的字符编码设置来检查这一点(在Ubuntu中它的终端 - >设置字符编码)。如果您正在使用PHPMyAdmin之类的东西,查看页面源并查找页面的charset,或者打开Firebug并查看页面的响应标题,它应该说&#34; UTF-8&#34;。< / p>

如果您已插入数据并以UTF-8编码并进入latin1表格,那么数据仍会以UTF-8格式存储,只有在您使用时才会存储开始查看该数据或以不同的编码检索您开始获得受损效果的数据。

我发现,当你使用字符编码时,你得到的一切都是一样的非常重要:页面必须有一个UTF-8的字符集,数据库的上游必须在UTF-8,数据库必须具有默认字符集和UTF-8存储。一旦你在混合物中放入一个不同的字符集,一切都会变得疯狂。

答案 1 :(得分:1)

latin1编码只有 1字节代码。

前面的128个代码(7位)在latin1和utf8之间大致相同。

public static function sendemail($recipient,$ticketdata) { Mail::send('emails.ticketbooked', $ticketdata, function ($message) use($recipient) { $message->to($recipient)->subject('Tickets Booking Confirmation'); }); } 超出了128;它的1字节,8位latin1十六进制是é(如您所见)。对于utf8,它需要2个字节:E9。对于大多数亚洲字符,utf8需要3个字节; latin1不能代表那些字符。

MySQL有令人困惑的命令C3A9。这宣布客户端的编码为utf8,并指示客户端和服务器之间的通信在 SET NAMES utf8之间进行转换,读/写时的utf8。

如果您有CHARACTER SET(旧的默认值),但客户端中的字节编码为utf8,那么您就是在说谎,并且会发生各种令人讨厌的事情。但是没有直接的线索表明出现了问题。

完全转到utf8的核对清单:

  • 客户端中的字节是utf8编码的
  • SET NAMES latin1(或连接到MySQL时的等效参数)
  • 列/表声明
  • SET NAMES utf8
  • CHARACTER SET utf8 in html