PHP - 来自 Mysql 的拉丁字符

标签 php mysql utf-8 character-encoding

我遇到了一个相当奇怪的问题: 我正在使用一个数据库(我没有设计),这个数据库是多语言的,即有英语、西类牙语、俄语、越南语等标题。

据我所知,带有“ñ”、“á”、“é”、“ë”类型字符的标题已以这种方式存储在数据库中:“ñ_”,所以我知道在html中显示这些字符如何编写它们是我的 PHP 代码中的“ñ”,在调用这些字符时(不使用任何类型的转换),我会发生以下情况:

Title in database: Se&ntilde_ora // Señora
Title obtained by PHP: Señ_ora // Señora

我尝试使用 utf_decode 和 html_entities_decode 但这不起作用。 我想这样做,使用 str_replace 删除标题“Señ_ora”中的“_”,但我得到:“Señora”

最佳答案

characters of type "ñ", "á", "é", "ë", have been stored in the database in this way: "&ntilde_"

这很奇怪。

首先,确保您的数据库确实包含这些 _ 字符,并确保您没有看到某种正在呈现的替换字符。无论您使用什么程序来显示数据,都可能有一些字符集选项设置不正确。

您可能会说SELECT field, HEX(field) FROM table WHERE field LIKE '%' ORDER BY CHAR_LENGTH(field) LIMIT 10来查找一些相对较短的示例。然后仔细检查十六进制输出,查找 3B(十六进制表示 ;)和 5F(十六进制表示 _)。

例如,在我的 UTF8 设置中,SELECT HEX('Señora'), HEX('Señ_ora') 给出这两个字符串

5365266E74696C64653B6F7261
                  xx
5365266E74696C64655F6F7261

看出区别了吗?

如果 _ 字符确实存在于您的数据中,则您需要进行一些网络 spy 事件。您是否可以联系到设置此内容的人,以便您可以询问一下?如果是这样,就这样做。这将为您节省一些逆向工程时间。

如果您必须在没有帮助的情况下解决此问题,您可以尝试像这样使用 php

 $my_data = str_replace('_',';', $my_data);

这应该使实体化字符的格式正确。 但是,它还会将独立的 _ 字符更改为 ;。要解决此问题,您需要数据中所有实体化字符的列表,并且需要单独更改它们。

关于PHP - 来自 Mysql 的拉丁字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46505234/

相关文章:

mysql - 有没有更好的方法在 MySQL 中编写 NOT IN(子查询)?

c# - 通过引用另一个表从一个表获取值

database - 数据库和网站中的不同编码集

spring - 内容类型 'text/plain;charset=UTF-8' 在 RestController 类中的 Spring Boot 中不支持错误

php - 如何检查一行中重复的列名并删除具有相同 class_name 的第二行

PHP - 每 15 分钟更新一次数据库

php - CodeIgniter IE 没有正确存储 session

php - 两个表逗号的mysql结果集

php - Laravel 迁移 - Model::find($id) 返回 NULL 但 $id 存在于数据库中

python - 在 python 中使用捷克字符时的问号