【问题标题】:Incorrect encoding from PHP?PHP的编码不正确?
【发布时间】:2012-12-13 09:33:51
【问题描述】:

1) 我在数据库中有一个表tbl_Data,其中有一个name 列,其中文本比较方法(?) 属性设置为utf8_polish_ci。当我通过 phpMyAdmin 浏览 tbl_Data 时,它就像一个魅力。

2) 在我的 html 代码中:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">

看来我正在为浏览器发送正确的编码标头...

3) 我的 PDO dsn 包含;charset=UTF-8,后面是 php 手册。

4) 在我使用的 php 代码中:

foreach(parent::query('SELECT ID,PLName,LatinName from tbl_Data') as $row) {
    $result = $result."
        <tr>
            <td>".utf8_encode($row['PLName'])."</td>
        </tr>
    ";
}

拥有所有这些后,我仍然得到“垃圾”(=?) 字符而不是正确的波兰字母,尽管其中一些显示良好(phpMyAdmin 显示正确)。我在这里缺少什么?请各位大侠指教!

我的 MySQL 引擎是 InnoDB,网络服务器:nginx 带有 fpm,如果它是相关的...

【问题讨论】:

  • 你看到utf8_encode function的php手册上的评论了吗?即:“如果你的文本已经是UTF-8,你不需要这个功能”?如果不使用utf8_encode 函数会怎样?
  • 如果我根本不使用此功能,那么我会收到来自“ó”的�,这在之前使用 utf8_encode() 时是正确的。其余丢失的字母仍然是“?”
  • 你使用的是什么 PHP 版本?
  • 此时 PHP 5.4.10

标签: php html encoding utf-8 pdo


【解决方案1】:

看来我正在为浏览器发送正确的编码标头。

错了。 &lt;meta&gt; 不是 HTTP 标头,而是 HTML 标签,非标准标签。因此,您的代码仍然缺少正确的标头。

header('Content-Type: text/html; charset=utf-8');

我的 PDO dsn 包含 ;charset=UTF-8,来自 php 手册。

如果您的 PHP 版本低于 5.3.6,它也不会工作。改用SET NAMES utf8 常规查询

【讨论】:

  • 我在ob_start(); 行之后添加了header(...) 行,但字符仍然不正确。唯一的区别是我是否使用utf8_encode()。如果代码使用它,则只有一个字母正确显示ó,如果不是,它们都不正确。 php --version 给我:PHP 5.4.10 (cli) (built: Dec 22 2012 22:12:36) Copyright (c) 1997-2012 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
【解决方案2】:

如果您的文本已经是 UTF-8 编码,则没有理由使用 utf8_encode()

一个潜在的问题可能是您的 PHP 版本。您的 DSN 的 ;charset=UTF-8 元素仅受 PHP 版本 >= 5.3.6 支持。 在 5.3.6 之前,此元素被静默忽略(而不是发出警告)。文档中提供了更多信息和解决方法: http://php.net/manual/en/ref.pdo-mysql.connection.php

【讨论】:

  • php --version in cli 给了我:PHP 5.4.10 (cli) (built: Dec 22 2012 22:12:36) Copyright (c) 1997-2012 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies 所以它看起来应该可以工作......
【解决方案3】:

字符集 UTF-8 很好(在您的 html 中):P

试试这个..(为此使用新的实验表来检查它,因为我不知道您的 PHP 脚本是否正在清理 $_POST 条目,或者根本不做某事..)

  1. 创建名为“polish_title”的列设置为utf8_bin(不是utf_ci_polish)

  2. 在 PHP 将(文本输入、润色)数据传递给 mysql INSERT (or update) 之前,用这个(PHP 集成)函数隐藏那些

    $polish_input = htmlspecialchars($input_polish_data);

    INSERT INTO table_name (polish_title) 值 ('$polish_input');

当波兰语符号是您输入的一部分时,您将在 mysql 表中看到奇怪的数据(通过 phpmyadmin),这是正常(或斑点)的一部分,但是当您获取 mysql 数据时,您的站点上的良好数据(波兰语本机);)

如果这行得通,您的所有 mqsql(文本)列都应更改为 utf8_bin。为了让您自己轻松输入,您可以创建一个函数,在这些输入进入 mysql DB 之前“清理”您网站上的所有 $_POST 输入。

最大的好处是来自其他国家的访问者会看到您的母语字母和标志(这也很重要)。

编辑(感谢常识用户输入)

是的,在您的标题中也必须包含此内容

header('Content-Type: text/html; charset=utf-8');

【讨论】:

    【解决方案4】:

    我无法评论你的帖子.....所以我建议在这里~_~
    here 开始,它表示 utf8_encode — 将 ISO-8859-1 字符串编码为 UTF-8
    因此,我的问题是:您的输出是 ISO-8859-1 吗?
    也许你可以创建一个正常的英语测试记录,然后再试一次。

    【讨论】:

    • 感谢您的建议,我添加了一个带有默认设置的测试列,并用所有可能的波兰字母填充了它。 phpMyAdmin 显示不错,但网站显示:?????�??
    • 普通英语怎么样,就像abcdefg一样?
    • 我只是在stackoverflow上搜索,猜你可能会参考这个stackoverflow.com/questions/9241709/…
    【解决方案5】:

    在您的 HTML 代码中,尝试:

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 2013-02-01
      • 2013-10-10
      相关资源
      最近更新 更多