我的表单中未正确处理字符 ®



一个带有textfield的简单表单=>发布到运行在Unix上的apache web服务器=>由PHP 5.3处理=>保存在mysql5表中,使用latin1字符集

Than,从DB检索并显示给用户。

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

顺便说一下,当同样的代码在运行Windows而不是Unix的开发机器上运行时,就不会发生这种情况

我做错了什么?

编辑:我不能改变mysql表的字符集,latin1有一个公司标准,我不欣赏,但它仍然是

字符编码在您的场景中多个地方发挥作用

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

最简单的方法是将整个链保持在utf-8编码:
将发送给浏览器的html文档的字符编码设置为utf-8,例如通过default_charset。
指示mysql服务器连接的字符集是utf-8,例如通过在do - mysql DSN中设置字符集属性。
使用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 />rn";
    }
}

您应该尝试使用utf8_general_ci排序

相关内容

  • 没有找到相关文章

最新更新