【问题标题】:The ® character is not processed correctly in my form® 字符在我的表单中未正确处理
【发布时间】:2013-04-24 11:02:32
【问题描述】:

堆栈:

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

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

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

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

我做错了什么?

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

【问题讨论】:

    标签: php mysql web-applications special-characters zpl


    【解决方案1】:

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

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

    将整个链保持为 utf-8 编码是最简单的:
    将发送给浏览器的 html 文档的字符编码设置为 utf-8,例如通过default_charset.
    向 mysql 服务器指示连接字符集是 utf-8,例如通过在PDO-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 />\r\n";
        }
    }
    

    【讨论】:

    • 太棒了,我希望有这样的答案。现在,你没有跳过 1. php 2. os 的字符集吗? (您在代码示例中包含了 php,但在说明中没有包含
    • 我怀疑我是否能够更改表格的字符集,这不是我的决定,很遗憾
    • 还有。我真的很想在我使用的所有软件堆栈中了解字符集的整个主题。你能推荐一本读物吗?
    • php核心本身目前没有字符编码的概念,操作系统在这个范围内不参与处理。重要的部分是 a) 向客户端/浏览器指示所有输入/输出都在 utf-8 中 b) 让 mysql 服务器知道所有输入/输出都在 utf-8 中完成。 a) 通过设置 default_charset 指令来实现,该指令让 php 发送包含 charset=utf-8 的 http 标头。 b) 通过在创建 PDO 对象时在 DNS 中设置 charset=utf8 端口来实现。见dev.mysql.com/doc/refman/5.0/en/charset-connection.html
    • 只要 mysql 表中字段的字符集具有 ® 的表示形式,您就可以使用该字符集(mysql 会自动进行转换)。如果没有该符号的表示,则 mysql 无法存储它。仍然可以自己进行一些转换,但我不建议这样做。
    【解决方案2】:

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

    【讨论】:

    • utf8 包含您需要的所有内容,并且 99% 的网页都使用它(又名 )例如,如果您的页面使用 UTF8 并且您的数据库使用 latin_*,则必须使用echo utf8_encode($field);随时。
    猜你喜欢
    • 2015-09-12
    • 1970-01-01
    • 2021-03-23
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    相关资源
    最近更新 更多