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保存到数据库不是最佳实践,但是我需要这样做。 -

答案

推荐阅读:UTF-8 all the way through

您的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).";";  
 
// &#69;&#116;&#116;&#197;&#145;&#108;&#32;&#97;&#32;&#112;&#105;&#108;&#108;&#97;&#110;&#97;&#116;&#116;&#195;&#179;&#108;&#32;&#107;&#101;&#122;&#100;&#118;&#101;&#44;

但是这不适用于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的区别

pdo 变量在 mysql 函数中未定义

PHP PDO:致命错误:未捕获的错误:在第[duplicate]行上对bool成员函数execute()的调用

PDO 查询未在 PHP foreach 循环中返回结果

PHP IIS7 MSSQL调用未定义的函数sqlsrv_connect

pdo sqlite 找不到驱动程序... php 文件未处理