该®字符不是在我的形式正确地处理
问题描述:
一个简单的形式与在UNIX上运行一个文本字段=> 发布到的Apache Web服务器通过PHP 5.3 => 保存在=> 处理带有latin1字符集的mysql5表
比从数据库中检索并显示给用户。
结果:当用户输入了®符号为形式,将它保存到数据库的两个符号,而不是一个,然后出现错误的ZPL打印机
顺便说一句,它不会发生时,在运行Windows而不是Unix的开发机器上运行相同的程序
我在做什么错?
编辑:我不能改变的字符集MySQL表的,有一个latin1的公司标准,我不明白,但它仍然是这样
答
字符编码戏剧在多个地方的规则在您的方案
- 其编码做客户端使用的参数发送到服务器
- 其编码确实MySQL服务器使用,以解读为此字符从PHP脚本发送到服务器
- 其编码确实MySQL服务器使用,以将结果发送回PHP脚本
- 其编码确实MySQL服务器使用存储
设置: - 其编码做客户端/浏览器用来呈现数据从PHP脚本发送到客户端/浏览器
这是最简单的,以保持整个供应链在UTF-8编码的数据你发送给你的html文件的字符编码e浏览器转换为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";
}
}
太棒了,我希望有这样的答案。现在,你没有跳过1. php 2. os的字符集吗? (你在代码示例中包含php但不在解释中 – shealtiel 2013-04-24 11:56:33
我怀疑我将能够更改表格的字符集,而不是我的决定不幸的是 – shealtiel 2013-04-24 11:58:44
而且我真的很想了解有一天,整个主题的角色在所有我使用的软件堆栈中设置,你能推荐一个阅读吗? – shealtiel 2013-04-24 12:00:29