该®字符不是在我的形式正确地处理

问题描述:

堆栈:该®字符不是在我的形式正确地处理

一个简单的形式与在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="&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"; 
    } 
} 
+0

太棒了,我希望有这样的答案。现在,你没有跳过1. php 2. os的字符集吗? (你在代码示例中包含php但不在解释中 – shealtiel 2013-04-24 11:56:33

+0

我怀疑我将能够更改表格的字符集,而不是我的决定不幸的是 – shealtiel 2013-04-24 11:58:44

+0

而且我真的很想了解有一天,整个主题的角色在所有我使用的软件堆栈中设置,你能推荐一个阅读吗? – shealtiel 2013-04-24 12:00:29

你应该尝试用utf8_general_ci MYSQL5表整理

+0

谢谢,为什么呢? shealtiel – shealtiel 2013-04-24 11:21:36

+0

utf8包含您需要的所有内容以及99%的网页使用它(又名) 例如,如果您的页面在latin_ *中使用UTF8和数据库,则必须使用echo utf8_encode($领域);任何时候。 – Shu 2013-04-24 11:34:12