堆栈:
一个简单的表单,带有张贴到在unix上运行的apache web服务器的textfield=>,由php 5.3 =>处理,保存在带有latin1字符集的mysql5表中。
然后,从数据库中检索并显示给用户。
结果:当用户在表单中输入®符号时,它将作为两个符号而不是一个符号保存到数据库中,然后在ZPL打印机中显示错误
顺便说一下,当同样的程序在运行Windows而不是Unix的开发机器上运行时,就不会发生这种情况
我做错了什么?
编辑:我不能改变mysql表的字符集,有一个我不喜欢的latin1公司标准,但它仍然是这样的。
发布于 2013-04-24 19:38:06
字符编码在您的场景中的多个位置执行规则
<>h19客户端/浏览器使用哪种编码来呈现从php脚本发送到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="®" />
<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-24 19:18:09
您应该尝试使用utf8_general_ci归类的mysql5表
https://stackoverflow.com/questions/16190294
复制相似问题