使用带有重音的外文字符转换

5
我试图将一些文本与数据库中的文本进行比较。在数据库中,任何带有重音符号的文本都会像HTML一样进行编码(即é),当我将数据库文本与我的字符串进行比较时,由于我的字符串只显示é,因此它们不匹配。当我使用PHP函数htmlentities对字符串进行编码时,é变成了奇怪的é?使用htmlspecialchars根本不会对é进行编码。
您如何建议我将é与é以及所有其他带重音符号的字符进行比较?

你为什么撤销了我的编辑?我犯了什么错误吗?我已经撤销了它。在你撤销之前,请告诉我我的编辑有什么问题。如果我犯了错误,我想学习或修复它。 - Dharman
4个回答

17

您需要向 htmlentities 函数发送正确的字符集。看起来您正在使用 UTF-8,但默认字符集是 ISO-8859-1。请像这样更改:

$encoded = htmlentities($text, ENT_COMPAT, 'UTF-8');

另一种解决方案是在编码之前将文本转换为ISO-8859-1,但这可能会破坏信息(ISO-8859-1不包含与UTF-8相同数量的字符)。如果您想尝试该方法,请按以下方式操作:

$encoded = htmlentities(utf8_decode($text));

谢谢!将字符集更改为UTF-8解决了问题。还有一个后续问题,有没有一种方法可以设置UTF-8而不设置ENT_COMPAT? - Devin Crossman
2
@Devin,ENT_COMPAThtmlentities第二个参数的默认值。从技术上讲,您可以将其设置为null,或者将其设置为htmlentities页面上的其他3个值之一。 - Kevin Peno
1
经过三个小时的谷歌搜索和尝试各种方法,我终于找到了这个页面,你真是太棒了 :) - Sunny
在调用 filter_var( $something, FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_HIGH | FILTER_FLAG_ENCODE_LOW | FILTER_FLAG_STRIP_BACKTICK ); 之前使用 $something = htmlentities($something, ENT_COMPAT, 'UTF-8'); 解决了我的问题。我原本以为只需要解码经过消毒的字符串,将其转换为正确的字符,但实际修复方法是在消毒调用之前放置您的代码。 - Juan Manuel López Manzano

7

我正在处理一份法语站点,我也遇到了同样的问题。这是我使用的函数:

function convert_accent($string)
{
    return htmlspecialchars_decode(htmlentities(utf8_decode($string)));
}

它的作用是将您的字符串解码为utf8,然后将所有HTML实体转换。甚至包括标签。但我们想要将标签转换回正常状态,然后htmlspecialchars_decode将把它们转换回来。因此最终您将获得一个已转换重音的字符串而不触及标签。

在将邮件内容发送给收件人之前,您可以通过这个函数传递您的电子邮件内容。

另一个问题是,有时候使用此函数从数据库中获取的内容会被转换为?。在这种情况下,在运行查询之前,您应该执行以下操作:

mysql_query("SET NAMES `utf8`");

但是你可能需要这样做,这取决于你表格中的编码方式。希望这可以帮到你。


我只是添加了:mysql_query("SET NAMES utf8");,然后它就完美地工作了!谢谢 - user2828251

1

比较任务与创建数据库或表时选择的字符集和排序规则有关。如果您保存了许多带重音符号的字符串,例如西班牙语,建议使用字符集uft8,并且排序规则应该更准确地匹配所使用的语言(英语、法语或其他语言)。

在数据库中使用正确的字符集的最好之处是,您可以以自然的方式保存字符串,例如:我的名字“Mario Juárez”,我不需要进行任何奇怪的转换。


1

最近遇到了类似的问题。按照Emil的回答在本地运行良好,但在我们的开发/测试环境中却不起作用。最终我使用了以下方法,在各个环境中都能正常工作:

$title = html_entity_decode(utf8_decode($item));

感谢您指引我正确的方向!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接