字符編碼戲劇在多個地方的規則在您的方案
- 其編碼做客戶端使用的參數發送到服務器
- 其編碼確實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