【问题标题】:Problems with charset, russian letters字符集、俄语字母的问题
【发布时间】:2013-12-08 08:14:56
【问题描述】:

我对字符集有疑问。当我用俄语字母向表格插入值时,它看起来像这样 - Р?ван。

这是我的数据库连接类。

class Database { 

    public $user = 'root';
    public $password = '';

    function __construct() {
        $this->connect();
    }
    function connect() {
        try {
            $this->dbh = new PDO('mysql:host=localhost;dbname=university', $this->user, $this->password,array(PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES CP1251'));
            $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        } catch(PDOException $e) {
            echo 'ERROR: ' . $e->getMessage();
            }
    }

    function selectQuery( $sql ) {
        $this->stmt = $this->dbh->prepare($sql);
        $this->stmt->execute();
    }

    function insertQuery( $sql ) {
        $this->stmt = $this->dbh->prepare($sql);
        $this->stmt->execute();
    }
}

是的,我知道,我没有在那里准备好声明,我解决问题后会这样做。正如您在数据库连接中看到的,我写了array(PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES CP1251')。它修复了从 db 显示值的问题(它的显示方式相同)。我的 sql 是这样的:

$q = $this->db->insertQuery("INSERT INTO students (id,first_name,second_name,last_name,course) VALUES ('','Иван','Иванян','Иванович','1')");

在表格中显示如下 - Р?ванян 我的所有文件都设置为没有 BOM 的 UTF 8。这里有什么问题?

编辑:表中的所有行也都在 utf8_general_ci 中

【问题讨论】:

  • 那么你发送到数据库的数据是用什么编码的呢?
  • 从 5.3.6 开始,字符集是 DSN 的一部分 .. 另外,你到底为什么要使用模拟准备?我强烈建议您咨询this tutorial。哦,你的 Database 类正在泄漏封装。再说一次,我仍然无法理解为什么人们试图为 PDO 制作如此神奇的包装器。
  • Teresko,我不确定你在说什么。
  • 我认为是在cp1251里,但是所有文件都是utf8没有bom,表是utf8_general_ci
  • Teresko,我查看了您的网址,但我的问题没有找到答案。

标签: php oop pdo character-encoding


【解决方案1】:

您的数据库类没有意义,因为您没有正确使用准备好的语句。甚至不从选择查询中返回任何内容。而且这样的课程总体上没有什么意义。

Р?ван。是 utf-8 编码的文本,显示为单字节编码。所以,你必须添加

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

到您的 PHP 文件。

【讨论】:

  • 你也必须将集合名称改回 utf8
猜你喜欢
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 2011-01-08
  • 2012-08-02
  • 2018-01-02
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多