【问题标题】:comparing unicode input with database string比较 unicode 输入与数据库字符串
【发布时间】:2012-07-18 08:43:48
【问题描述】:

我一直在 stackover 中反复搜索,但没有找到解决问题的方法。 我需要将用户输入的字符串与 mysql 数据库中的现有字符串进行比较。 存储在数据库中的字符串如下: xuất khẩu 意思是:“xuất khẩu”:)

用户从文本框中输入的字符串是:“xuất khẩu”

但是当我尝试比较 2 个字符串时,mb_encode、htmlentities 等。但它绝不表示字符串匹配!

数据库使用utf-8通用ci,网站正确显示utf8字体。

谁能给我解决方案?

【问题讨论】:

    标签: php mysql html utf-8 encode


    【解决方案1】:

    确保您在比较时使用:

    html_entity_decode($mysqlValue, ENT_QUOTES, 'UTF-8'); // Compare with the unprocessed user input.
    

    (这会将来自 HTML 实体的 DB 值解码为特殊字符。)

    或者:

    htmlentities($userInput, ENT_QUOTES, 'UTF-8'); // Compare with the unprocessed DB value.
    

    (这会将包含特殊字符的字符串中的用户输入编码为包含 HTML 实体的字符串。)

    数据库中的文本是 HTML 实体,所以我会寻找基于它的解决方案。我怀疑 UTF-8 编码是否存在问题,但最好在函数中指定以防万一。

    【讨论】:

    • 我尝试了您的解决方案,但它不起作用。 $foo=$row[$column]; // 从数据库中获取 $bar=$value; // 用户输入 $foo=html_entity_decode($foo, "ENT_QUOTES", "UTF-8");
    • @gaixixon 您需要删除 ENT_QUOTES 周围的引号,因为它是一个常量。如果您按照注释中的方式编写代码(并假设 $foo 和 $bar 包含正确的数据库/用户输入值),您现在可以使用条件 if ($foo == $bar) {echo 'same ';} else {echo '不一样';}
    • 我想我找到了问题所在。在通过 ajax 调用将变量传递给 PHP 之前,我使用 $("#checkname").load("modules/utils/checkname.php?tb=product&column=product_name&value="+encodeURI(this.value)); 所以当我检查带有空格键和非 unicode 字符的字符串时,代码有效。但是当将字符串与空格键和 unicode 字符进行比较时,代码不起作用。你能给我解决办法吗?
    • 啊哈,有道理。在这种情况下,您需要在 PHP 中解码用户输入。做类似$userinput = rawurldecode($_GET['value']);的一些功能:rawurldecodeurldecode
    【解决方案2】:

    将以下内容添加到我的.ini 文件中解决了问题:

    character-set-server = utf8  
    collation-server = utf8_general_ci
    

    【讨论】:

      【解决方案3】:

      当对表格字段使用“utf-8 general ci”时,值会正确存储,但在比较字符串时会出现问题。例如,字符串 'tèst' 和 'test' 在与 charset 和 collat​​ion 为 utf-8 general ci..的值进行比较时将返回 true。

      尝试将排序规则/字符集设置为 utf8_bin。这在执行字符串比较时要安全得多。

      但请记住,utf8_bin (ci) 没有不区分大小写的版本,因此您必须在保存之前将字符转换为小写。

      问候,

      【讨论】:

        猜你喜欢
        • 2015-11-08
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 2011-11-28
        • 1970-01-01
        相关资源
        最近更新 更多