我知道关于UTF-8问题有成百上千的问题,但是我尝试了所有可以找到的方法,但都无济于事。
事实:
我正在尝试从MySQL数据库读取包含é的字符串,并将其显示在PHP页面上。实际上,它的确显示为é(但字体不能这样识别,因此使用了另一种默认字体)。当我想使用PHP函数将字符串转换为文件名来替换字符串时,出现了麻烦。 PHP根本不将其识别为é字符。
这是我正在做的事情的简要概述:
1)字符串存储在MySQL数据库中。 MySQL服务器设置为:
MySQL连接排序规则utf8_unicode_ci
MySQL字元集:UTF-8 Unicode(utf8)
数据库本身设置为排序规则utf8_unicode_ci(MyISAM存储引擎,由于共享服务器而无法更改)
实际表设置为collcation utf8_unicode_ci(InnoDB存储引擎)
é在phpMyAdmin中正确显示。数据通过Java程序插入到DB中,但是我也尝试使用手动输入的数据(在phpMyAdmin中输入)进行尝试。
2)未设置PHP default_charset(无值),我在共享服务器上,放置手动替代php.ini似乎不起作用。使用ini_set("default_charset", 'utf-8');可行,但对我遇到的问题没有影响。
3)在运行实际的选择查询之前,我先查询SET NAMES 'utf8'。查询本身无关紧要,但是为了进行测试,我选择了一个简单的SELECT title FROM items WHERE item_id = 1
4)PHP文件本身编码为UTF-8。我已经使用为html设置了正确的字符集
5)为了测试问题,我在返回的字符串(Astérix)上使用了htmlentities,检查将其转换为Astérix的源代码,这当然是不正确的。因此,该字符串在浏览器中显示为Ast??rix。
可能有什么原因呢?对我来说,似乎我将所有可以设置为UTF-8的东西都设置了。
重复的。 搜索一下
我明确表示,我确实在SO上对此进行了研究,但是所提供的解决方案(我在本文中实际上提到的大多数解决方案)都没有帮助。 当您在我发布问题后不到1分钟的时间内无法阅读实际问题时,我只能假设您没有思考就走了"另一个愚蠢的UTF问题DUPE"。 谢谢,非常感谢:/
然后,您没有足够的搜索。 真。
是的,当然一定是这样。 只需检查右边显示的一些"相关"问题即可。 他们甚至都没有提到多字节函数。 他们都假设(通常是正确的)某个地方的存储或检索中断了UTF-8链,而Joe指出的情况并非如此。 而且,我相当确定您在发布无用的注释时不会想到"哦,很明显,请使用多字节函数",否则您只是提到了这一点。
http://php.net/manual/zh-CN/ref.mbstring.php-查看多字节字符串函数。
因此,您说Im在存储和检索数据库中的数据方面没有做错什么,而是Im使用错误的PHP函数来"处理"它吗?
看起来像-就像您说的一样,所有内容都设置为使用UTF-8,除非您将其回显为未将其视为UTF-8。 PHP不会自动检测字符串的字符集(它喜欢ISO-8859-1:P),因此您必须帮忙,因此需要多字节函数。
我只是使用htmlentities的显式htmlentities($string,ENT_COMPAT,"UTF-8")版本进行了检查,它确实证实了您的怀疑。 非常感谢 :)