Hướng dẫn dùng utf encoding trong PHP

Khi chuyển database MySQL từ phiên bản 3.x lên 4.1 trở đi bạn sẽ gặp vấn đề với mã font Unicode, để khắc phục tình trạng này bạn có thể làm theo hướng dẫn sau:

1. Import database vào MySQL 4.1 – 5.0.x:
Khi import file database là dạng mã unicode (File sql của bạn phải chắc chắn là định dạng unicode utf8) vào MySQL 4.1 trở lên trước tiên bạn vào phpMyAdmin tạo database với Collation của Charset là định dạng utf8 chẳng hạn chọn utf8_general_ci sau đó click Create như hình sau:

Hướng dẫn dùng utf encoding trong PHP

Sau khi tạo xong bạn click chọn SQL để import database:
Hướng dẫn dùng utf encoding trong PHP

Tới đây bạn Browse file database của bạn chú ý muc Character set of the file phải để là utf8 click Go để kết thúc import.
Bây giờ bạn có thể xem tiếng việt thể hiện trong phpMyAdmin đúng theo đinh dạng unicode utf8.
Hướng dẫn dùng utf encoding trong PHP

2. Hiển thị unicode utf8 trên web PHP:
Tuy ở trên bạn đã import và hiển thị đúng với định dạng unicode utf8 tuy nhiên khi bạn chay một số ứng dụng web PHP của bạn sẽ vẫn gặp lỗi hiển thị unicode như sau (font unicode bị hiển thị thành dấu ? và ô vuông):
Hướng dẫn dùng utf encoding trong PHP

Để khắc phục vấn đề này MySQL cung cấp cho bạn một câu truy vấn SET NAMES ‘utf8′ , Trong php sau câu truy vấn kết nối database bạn thực hiện thêm một câu truy vấn như đoạn code sau:
Ví dụ:
$dbhost =”localhost”;
$dbname =”mediaonline “;
$dbuser =”chilinhnet”;
$dbpass =”chilinh”;
$db =mysql_connect(“$dbhost”,”$dbuser”,”$dbpass”) or die(“Die connect: “.mysql_error());
mysql_select_db(“$dbname”) or die(“Die select database: “.mysql_error());
mysql_query(“SET NAMES ‘utf8′”, $db);
?>
Bây giờ thì bạn hoàn toàn yên tâm với việc thể hiện tiếng việt Unicode utf8 100% trên website PHP:
Hướng dẫn dùng utf encoding trong PHP

Chú ý: Đối với một số hosting không cho phép bạn tạo Collation Charset khi tạo database mới từ phpMyAdmin (thường là các phiên bản phpMyAdmin cũ) bạn cũng có thể làm theo cách sau:

Bạn vẫn tạo database và import database bình thường (Mặc định những hosting đó sẽ cấu hình MySQL là Latin1), trong trường hợp có những tùy chọn Chatset bạn cũng phải chọn là Latin1. Lúc này trong phpMyAdmin bạn sẽ không thấy hiển thị tiếng việt Unicode utf8 bởi vì phpMyAdmin đã gắn đoạn code SET NAMES ‘utf8′, tuy nhiên khi browse web site php của bạn sẽ hiển thị đúng tất nhiên là bạn không được phép sử dụng đoạn code SET NAMES ‘utf8′ trong mã lên của bạn khi dùng cách import này.

//
//

Author:
Lê Chí Linh

Mã hóa chuỗi unicode

Trường hợp bạn cần viết một chuỗi unicode được mã hóa mà không được sử dụng trực tiếp ký tự unicode vào code. Cách này đặc biệt hữu dụng trong việc sửa đổi bytecode của java để hiển thị tiếng việt.
Vậy thì làm thế nào?
Sử dụng hàm json_encode sẽ giúp bạn tìm ra chuỗi mã hóa unicode.

header('content-type:application/json');		#or text/plain
echo json_encode(array('fullname'=>'hoang','address'=>'An Giang','LoanType'=>'Vay theo lương'));

Kết quả ra chuỗi json thế này chứa các kỹ tự unicode mã hóa giống như thế này.

[{"fullname":"hoang","address":"An Giang","loanType":"Vay theo l\u01b0\u01a1ng"}]

Để hiển thị chuỗi giải mã đọc được từ ký tự unicode mã hóa bởi json_encode, chúng ta gọi hàm json_decode

print_r(json_decode('["Vay theo l\u01b0\u01a1ng"]'));

Kết quả chuyển thành mảng có chứa ký tự đã giải mã:

Array ( [0] => Vay theo lương )

unescape unicode
Nếu bạn muốn hiển thị chuỗi unicode về phía người dùng như đầu vào, có thể đọc được hay nghĩa là đã giải mã, thì thêm tham số JSON_UNESCAPED_UNICODE vào hàm json_encode. Ví dụ:

json_encode(array('fullname'=>'hoàng'),JSON_UNESCAPED_UNICODE);

Hiển thị nguyên ký tự unicode như đầu vào.

Cách khác cho kết quả tương tự như vậy, chúng ta mã hóa dạng entity trước khi gọi json_encode và decode entity sau khi được chuỗi json.

'Paição','cidade'=>'São Paulo');
$array = array_map('htmlentities',$array);
//encode
$json = html_entity_decode(json_encode($array));

//Output: {"nome":"Paição","cidade":"São Paulo"}
echo $json;
?>
Một số kiểu encoding có thể sử dụng

MD5 converter
SHA1 converter
Chatset converter / iconv
Base64 encode
Base64 decode
UTF8 encode
UTF8 decode
Raw url encode
Raw url decode
HTML entities encode
HTML entities decode
Unix Time to Human Date
Human Date to Unix Time Stamp
Remove duplicate lines
Sort text lines
Pirate Text
Backwards – Mirrored Text

Sử dụng công cụ chuyển đổi encoding/decoding chuỗi online:
http://www.cafewebmaster.com/online_tools/utf8_encode.

Mã hóa đối tượng

Nhiều lúc việc mã hóa mảng thành chuỗi json không tiện cho lắm, dễ bị người khác đọc dữ liệu vì tính bảo mật. Có một cách khác giúp bạn mã hóa mọi đối tượng thành kiểu chuỗi, và WordPress cũng đã sử dụng cách mã hóa các đối tượng của nó với kiểu này.

Bằng cách sử dụng hàm serialize() để mã hóa đối tượng và hàm ngược unserialize() sẽ biến nội dung kiểu chuỗi được mã hóa bởi serialize() thành chính object trước đó.

"Hoang", "old"=>24);
var_dump($data); 
/*    array
            'name' => string 'Hoang' (length=5)
            'old' => int 24
*/

// Serialize array $data
$text_serialize = serialize($data); 
var_dump($text_serialize); 
/*  string 'a:2:{s:4:"name";s:3:"Hoang";s:3:"old";i:24;}' (length=44) */

// Unserialize array $data
$data_unserialize = unserialize($text_serialize);
var_dump($data_unserialize);
/*    array
            'name' => string 'Hoang' (length=5)
            'old' => int 24
*/
?>

Như ví dụ trên, ta thấy array $data được Serialize thành chuỗi:

a:2:{s:4:"name";s:3:"Hoang";s:3:"old";i:24;}

Rất tiện cho các bạn lưu các đối tượng PHP vào Database.
Lưu ý: Ta có thể sử dụng serialize() và unserialize() cho mọi đối tượng PHP: object, array, base object,…

Trong WordPress có viết hàm giúp bạn kiểm tra một chuỗi được tạo bởi serialize từ một đối tượng, trước khi sử dụng hàm giải mã đối tượng unserialize bạn nên kiểm tra có hợp lệ không với hàm is_serialized của wordpress. Hàm này mình trích dẫn có sẵn trong wordpress rồi nhé:

Cách sử dụng:

if(is_serialized($str)){
	var_dump(unserialize($str));
}

Chú ý: bạn không thể mã hóa hàm bằng serialize là không cho phép. Ngoài cách sử dụng hàm is_serialize của wordpress có thể dùng trực tiếp hàm có khả năng giải mã chuỗi thành đối tượng hay không:

//Check to see if a string is serialized?
$data = @unserialize($str);
if ($str === 'b:0;' || $data !== false) {
    echo "ok";
} else {
    echo "not ok";
}

Bạn có thể kết hợp giữa kiểu mã hóa mảng với serialize và base64, bảo mật 100% khiến người dùng không thể đọc chuỗi mã hóa cuối cùng của mảng.

//best way to encode array use combination of base64 & serialize
$safe_string_to_store = base64_encode(serialize($multidimensional_array));

//to unserialize...
$array_restored_from_db = unserialize(base64_decode($safe_string_to_store));

Nếu bạn thấy bài viết này hữu ích, hãy chia sẻ với bạn bè bằng cách nhấn nút chia sẻ ở bên dưới. Theo dõi chúng tôi trên Twitter và Facebook