Dev*_*man 1 php sql character-encoding
我有一个使用latin-1的数据库和一个utf-8的PHP应用程序.
我在数据库中有这样的字符串:
" SociéTA© "这应该是法国兴业
' 1亿欧元'应该是20亿欧元.
当我使用PHP的ord()将错误字符打印到屏幕时,从db中返回的数据,它打印195和226.
有人可以解释为什么会发生这种情况(为什么要像这样保存以及为什么字符被读取)以及我是否可以反转它.
为什么:
1) é是unicode 233(浏览器读取它).
éutf8字节转换为latin1 chars字节是Ã ©.这就是它在数据库中出现的原因.
à ©被识别为Ã代码点195.因此,为什么你看到它.
2) €是unicode 8364.
€utf8字节转换为latin1 chars字节是â <82> ¬.这就是为什么它们在数据库中看起来像这样.
â <82> ¬被识别为â代码点226.这也是你看到这一点的原因.
这就是为什么你会看到这些值ord()以及为什么字符以这种方式存储在latin-1数据库中的原因.
相反:
要反转它,我们需要Latin-1 char字节到UTF8字节.
如果我们尝试它:
â是226.转换拉丁-1到utf8产生â.
Ã是195.转换拉丁-1到utf8产生Ã.
问题:
问题是Latin-1的字符数少于utf-8(很长一段时间).
Latin1单字节流和UTF8多字节字符串流,因此utf8中的1个字符可以为latin1生成最多4个字符.
因此,UTF-8到Latin-1转换会产生错误的字符.
Latin1回到utf8是不可能的.
解:
如果您无法更改数据库的字符集,我可以建议在编写数据库之前在其字符实体中编码特殊字符(因此数据库可以保留为latin1和app作为utf8,因为两者都可以理解html实体),例如umlaut as Ä.
可以使用PHP html_entity_decode()结合mb_detect_encoding()检测和转换特定字符来完成.
参考文献:
见ltf.ed.ac.uk为utf8的字符字节LATIN1字节:
http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=%C3%96&mode=char
| 归档时间: |
|
| 查看次数: |
2642 次 |
| 最近记录: |