UTF-8 解码变音符号偶尔会失败

Posted

技术标签:

【中文标题】UTF-8 解码变音符号偶尔会失败【英文标题】:UTF-8 decoding umlauts failing occasionally 【发布时间】:2014-08-25 03:21:21 【问题描述】:

好的,这很奇怪,我真的不知道是什么导致了我的问题:

工作流程:

我有一个带有 utf-8 列的常规 mysql 数据库。 我正在通过一个简单的输入字段将带有德语变音符号的文本插入到此列中。 我正在使用简单查询读取和显示行。

我的问题:

有时且仅有时会显示变音符号而不是问号。 奇怪的是,它只有某些词,而不是所有的变音符号。 例如:“Gummibären”导致“ä”出现问号,但“Gumibären”(注意单个“m”)显示正确。所以,我真的想不出这里的模式。

列在utf8_general_ci html 文件使用<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> php 文件本身以 utf-8 编码

查询是:

mysqli_query("SET NAMES 'utf8'"); 
$var = "SELECT * FROM table ORDER BY id DESC";

同样奇怪的是,“ä”不是被1个问号而是2个问号代替,好像有2个字符没有编码而不是1个。

我有什么遗漏吗?

【问题讨论】:

警告 - mysql_query 此扩展自 PHP 5.5.0 起已弃用,将来将被删除。相反,应该使用 MySQLi 或 PDO_MySQL 扩展。 UTF-8 encoded html pages show � (questions marks) instead of characters 的可能重复项 从上面链接的 QA 中,“如果数据是从数据库中获取的,您可以使用 mb_detect_encoding() 来验证其编码。” 谢谢,我读了这篇文章并做了一些研究。不幸的是,它对我的​​问题没有多大帮助。奇怪的是,某个变音符号的每隔一次出现都会正确显示,而不是显示为�。如果我设置 mysqli_set_charset($con,"utf8");它显示 2 �� 如果不是,它显示单个��。 mb_detect_encoding 显示 ASCII 【参考方案1】:

我想通了。它与在数据库中读取或写入 utf 没有任何关系,而是与 PHP 函数 wordwrap() 有关。如果wordwrap() 与“ä”等多字节unicode 字符一起使用,则会弄乱字符串。 我在这个的帮助下想通了:Multi-byte safe wordwrap() function for UTF-8 和这个:php wordwrap cut parameter when dealing with weird characters - 以供将来参考。

感谢您的意见!

【讨论】:

以上是关于UTF-8 解码变音符号偶尔会失败的主要内容,如果未能解决你的问题,请参考以下文章

Python2 / Windows7:打开包含德语变音符号的文件名

美国布局的变音符号和其他符号的替代键盘映射

用英语等价物替换德语字符(变音符号、重音符号)

MongoDB 匹配部分文本忽略重音符号(变音符号)

python 删除变音符号去掉文本中字符的附加符号

在 JavaScript 中删除字符串中的重音符号/变音符号