0

堆栈:

一个带有文本字段的简单表单=> 发布到在 unix 上运行的 apache web 服务器 => 由 php 5.3 处理 => 保存在 mysql5 表中并使用 latin1 字符集

然后,从数据库中检索并显示给用户。

结果:当用户在表单中输入 ® 符号时,它作为两个符号而不是一个符号保存到数据库中,然后在 ZPL 打印机中出现错误

顺便说一句,当它在运行 Windows 而不是 Unix 的开发机器上运行时不会发生

我究竟做错了什么?

编辑:我无法更改 mysql 表的字符集,有一个 latin1 的公司标准,我不欣赏,但仍然如此

4

2 回答 2

1

字符编码在您的场景中的多个位置发挥规则

  • 客户端使用哪种编码将参数发送到服务器
  • mysql 服务器使用哪种编码来解释从 php 脚本发送到服务器的字符
  • mysql 服务器使用哪种编码将结果发送回 php 脚本
  • mysql服务器使用哪种编码来存储数据
  • 客户端/浏览器使用哪种编码来呈现从 php 脚本发送到客户端/浏览器的数据

将整个链保持为 utf-8 编码是最简单的:
将发送到浏览器的 html 文档的字符编码设置为 utf-8,例如通过default_charset
向 mysql 服务器指示连接字符集是 utf-8,例如通过在PDO-MYSQL DSN中设置 charset 属性。
使用 utf-8 作为默认字符集创建表,而不为字段本身指定另一种编码。

自包含示例:

<?php
ini_set('default_charset', 'utf-8');
$fn = isset($_POST['val']) ? 'doDatabase' : 'doForm';
doHtml($fn);


function doHtml($fn) { ?>
<html>
    <head><title>...</title></head>
    <body>
        <?php $fn(); ?>
    </body>
</html>
<?php
}

function doForm() { ?>
    <form method="POST" action="?">
        <div>
            <input type="text" name="val" value="&reg;" />
            <input type="submit" />
        </div>
    </form>
<?php       
}

function doDatabase() {
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    $pdo->exec('
        CREATE TEMPORARY TABLE soFoo (
            id int auto_increment,
            val varchar(30),
            primary key(id)
        ) DEFAULT CHARACTER SET utf8
    ');

    $stmt   = $pdo->prepare('INSERT INTO soFoo (val) VALUES (?)');
    $stmt->execute( array($_POST['val']) );
    $stmt = null;

    foreach( $pdo->query('SELECT * FROM soFoo', PDO::FETCH_ASSOC) as $row ) {
        echo 'row: ', join(', ', $row), "<br />\r\n";
    }
}
于 2013-04-24T11:38:05.973 回答
0

您应该尝试使用utf8_general_ci排序规则的 mysql5 表

于 2013-04-24T11:18:09.143 回答