代码之家  ›  专栏  ›  技术社区  ›  Addsy

PHP中的UTF-8编码问题

  •  2
  • Addsy  · 技术社区  · 15 年前

    另一个与UTF-8相关的问题我相信…

    我使用php更新mysql数据库中的数据,然后在站点的其他地方显示这些数据。以前我遇到过UTF-8问题,在浏览器中查看特殊字符时,这些字符会显示为问号,但这个问题似乎略有不同。

    我有许多记录要输入,其中包含_字符。如果我直接在数据库中输入这个值,那么它会正确地出现在页面上,所以我认为这意味着UTF-8内容的输出是正确的。

    但是,当我尝试通过php更新db中的值时,会替换_字符。取而代之的是ã¨(不带空格),在浏览器中显示为¨

    我将数据库中的表设置为使用UTF-8。我相信这是正确的cos,如前所述,如果我通过phpmyadmin更新db,一切正常。同样,我为页面设置了字符编码,这似乎是正确的。在尝试更新数据库之前,我还运行了SQL语句“set names'utf8';”。

    关于问题可能在哪里,有人有其他想法吗?

    多谢

    4 回复  |  直到 15 年前
        1
  •  3
  •   Peter Bailey    15 年前

    是的。

    你的性格是 LATIN SMALL LETTER E WITH GRAVE . 如您所见,在UTF-8中,该字符被编码为两个字节。 0xC3 0xA8 .

    但在许多默认情况下,只有单字节的西方编码(如ISO-8859-1),这个多字节字符被解码为两个单独的字符, LATIN CAPITAL LETTER A WITH TILDE DIAERESIS . 注意它们是如何编码为 C3 A8 在ISO-859-1?

    此外,看起来PHP正在通过 htmlentities() 结果是 Ã ¨ 分别。

    那么,代码中的问题到底在哪里呢?好, htmlentities() 因为它的第三个参数是一个编码名,您可能没有正确设置为 'UTF-8' . 但它也可以是其他一些字符串处理函数。 (注意:作为一般规则,将HTML实体存储在数据库中是一个坏主意-此步骤应保留用于显示时间)

    有很多其他的方法可以让你在PHP中使用UTF-8——我建议你试试看。 the cheatsheet 确保身体状况良好。

        2
  •  1
  •   Your Common Sense    15 年前

    好吧,这是你自己的代码,把字符转换成实体。
    要使其正确:

    1. 禁令 htmlentities 永远从脚本中运行。
    2. 使用 htmlspecialchars ,但不是在插入时,而是显示数据。
    3. 使用修复数据库中的现有数据 html_entity_decode .
        3
  •  0
  •   Artefacto    15 年前

    我想您正在获取一些表单提交的结果,并将结果插入数据库中。如果是这样,您必须确保指示浏览器发送UTF-8数据,并且应该验证用户输入的有效UTF-8流。

    将表单元素更改为包含接受字符集:

    <form accept-charset="utf-8" method="post" ... >
        <input type="text name="field" />
        ...
    </form>
    

    数据验证方式:

    $valid = array_key_exists("field", $_POST) && !is_array($_POST['field']) &&
        preg_match('//u', $_POST['field']) && ...; //check length with mb_strlen etc.
    
        4
  •  0
  •   Marek    15 年前

    我认为您错过了HTML页面上的内容类型声明:

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    

    如果没有,浏览器将猜测编码,并在发布表单时将编码之外的任何字符转换为实体。

    推荐文章