2013-04-24 36 views
0

堆棧:該®字符不是在我的形式正確地處理

一個簡單的形式與在UNIX上運行一個文本字段=> 發佈到的Apache Web服務器通過PHP 5.3 => 保存在=> 處理帶有latin1字符集的mysql5表

比從數據庫中檢索並顯示給用戶。

結果:當用戶輸入了®符號爲形式,將它保存到數據庫的兩個符號,而不是一個,然後出現錯誤的ZPL打印機

順便說一句,它不會發生時,在運行Windows而不是Unix的開發機器上運行相同的程序

我在做什麼錯?

編輯:我不能改變的字符集MySQL表的,有一個latin1的公司標準,我不明白,但它仍然是這樣

回答

1

字符編碼戲劇在多個地方的規則在您的方案

  • 其編碼做客戶端使用的參數發送到服務器
  • 其編碼確實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

0

你應該嘗試用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

相關問題