PHP Htmlentities函数未使用PDO将字符串编码为数据库
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP Htmlentities函数未使用PDO将字符串编码为数据库相关的知识,希望对你有一定的参考价值。
我有一个字符串(外语),我需要转换为htmlentities。我正在从Linux Ubuntu上的终端运行php脚本。
我需要这个:
$str = "Ettől a pillanattól kezdve,"
变得像这样:
Зм&
$str = "Ettől a pillanattól kezdve,";
$strEncoded = htmlentities($str, ENT_QUOTES, "UTF-8");
$cmd = $pdo->prepare("UPDATE table SET field = :a");
$cmd->bindValue(":a", $strEncoded);
$cmd->execute();
数据库/表信息:
- 字符集:utf8
- 整理:utf8_general_ci
未按预期保存。Obs:我知道使用htmlentities
保存到数据库不是最佳实践,但是我需要这样做。 -
您的htmlentities
PHP代码为我提供了Ettől a pillanattól kezdve
,用于该字符串。
htmlentities
函数仅对已翻译的字符起作用。
您正在使用的ő
字符没有相应的HTML实体翻译,因此不需要。
HTML实体功能主要用于HTML命令字符,例如<
,>
,&
和其他非标准的东西,但是说实话,在附加了HTML指令的字符范围之外,它非常随意对他们来说,例如尖括号和“&”号。
您似乎正在寻找一些东西来转换all基本不存在的非基本拉丁字符(据我所知)。
此外,您的字符ő
看起来像是[o波浪号]字符õ
,其中does具有HTML实体,但它们是不太相同。非完全匹配项无法比较。
[许多字符集包含的字符看上去(几乎)与人类相同,但对计算机而言却并不完全相同。最好的选择是确保mysql已使用最大可能的字符集之一正确编码(读取:4字节UTF-8),然后可以忽略htmlentities
忽略的字符。
因此,更新您的MySQL数据库和表以使用utf8mb4_unicode_ci
字符集和排序规则。
数据库/表信息:
- 字符集:utf8mb4
- 整理:utf8mb4_unicode_ci
Read here for the full List of HTML entities
推荐阅读:UTF-8 all the way through
为了匹配问题,您必须使用dec值自己重建实体。这将与您指定的字符串一起使用:
<?php
$str = str_split("Ettől a pillanattól kezdve,");
foreach ($str as $k => $v)
echo "&#".ord($v).";";
// Ettől a pillanattól kezdve,
但是这不适用于255以上的字符。
https://www.php.net/manual/en/function.ord.php
将字符串的第一个字节的二进制值解释为无符号0到255之间的整数。如果字符串采用单字节编码,例如ASCII,ISO-8859或Windows 1252,则等效于返回字符在字符集映射表中的位置。然而,请注意,此函数不知道任何字符串编码,并且在特别是永远不会在多字节中标识Unicode代码点编码,例如UTF-8或UTF-16。
以上是关于PHP Htmlentities函数未使用PDO将字符串编码为数据库的主要内容,如果未能解决你的问题,请参考以下文章
PHP htmlentities 和 htmlspecialchars的区别
PHP PDO:致命错误:未捕获的错误:在第[duplicate]行上对bool成员函数execute()的调用