2010-09-15 32 views
5

Tôi gặp một số vấn đề khi sử dụng PHP để chuyển đổi nội dung cơ sở dữ liệu ISO-8859-1 thành UTF-8. Tôi đang chạy đoạn mã sau để kiểm tra:PHP: Sự cố khi chuyển đổi ký tự "’ "từ ISO-8859-1 sang UTF-8

// Connect to a latin1 charset database 
// and retrieve "Georgia O’Keeffe", which contains a "’" character 
$connection = mysql_connect('*****', '*****', '*****'); 
mysql_select_db('*****', $connection); 
mysql_set_charset('latin1', $connection); 
$result = mysql_query('SELECT notes FROM categories WHERE id = 16', $connection); 
$latin1Str = mysql_result($result, 0); 
$latin1Str = substr($latin1Str, strpos($latin1Str, 'Georgia'), 16); 

// Try to convert it to UTF-8 
$utf8Str = iconv('ISO-8859-1', 'UTF-8', $latin1Str); 

// Output both 
var_dump($latin1Str); 
var_dump($utf8Str); 

Khi tôi chạy này theo quan điểm nguồn của Firefox, đảm bảo thiết lập mã hóa của Firefox được thiết lập để "phương Tây (ISO-8859-1)", tôi có được điều này:

asd

Cho đến giờ, rất tốt. Đầu ra đầu tiên chứa câu trích dẫn kỳ lạ đó và tôi có thể thấy nó chính xác vì nó ở ISO-8859-1 và Firefox cũng vậy.

Sau khi tôi thay đổi mã hóa của Firefox thiết lập để "UTF-8", nó trông như thế này:

asd

đâu báo giá đi? Không phải là iconv() phải chuyển đổi sang UTF-8?

Trả lời

14

U + 2019 ĐÁNH GIÁ ĐÁNH GIÁ TUYÊN BỐ ĐÊM không phải là một ký tự trong ISO-8859-1. Đó là một ký tự trong windows-1252, dưới dạng 0x92. Ký tự ISO-8859-1 thực tế 0x92 là một số ít được sử dụng C1 control character được gọi là "Sử dụng riêng 2".

Rất phổ biến để gắn nhãn dữ liệu văn bản Windows-1252 với nhãn mã vạch ISO-8859-1. Nhiều web các trình duyệt và ứng dụng e-mail xử lý MIME charset ISO-8859-1 như ký tự Windows-1252 để chứa dán nhãn sai như vậy nhưng nó là hành vi và chăm sóc không đạt tiêu chuẩn nên được thực hiện để tránh tạo ra những ký tự trong ISO-8859-1 được gắn nhãn nội dung .

Dường như đây là những gì đang xảy ra ở đây. Thay đổi "ISO-8859-1" thành "windows-1252".

+0

Wow, tôi đã làm điều đó và tôi thấy U + 2019 trong UTF-8 chế độ! Nhưng có an toàn khi sử dụng "windows-1252" để chuyển đổi một lượng lớn dữ liệu từ "ISO-8859-1" sang "UTF-8" không? Nói cách khác, tất cả các ký tự ISO-8859-1 vẫn chuyển đổi chính xác? – mattalxndr

+1

Các ký tự 0x80-0x9F sẽ không chuyển đổi chính xác. Nhưng đây là những nhân vật điều khiển mà hầu như không bao giờ được sử dụng. – dan04

+1

@mattalexx Nếu bạn kiểm tra chuỗi ký tự trong phạm vi đó và tìm thấy bất kỳ, đó là một cược tốt rằng chuỗi được mã hóa trong Windows-1252. Nếu bạn không ** tìm thấy bất kỳ ký tự nào trong phạm vi đó, có nhiều khả năng là ISO-8859-1. –

0

này sẽ giải quyết vấn đề của bạn, giả rằng tiêu đề trang của bạn charset là utf-8:

// Opens a connection to a MySQL server 
$connection = mysql_connect ($server, $username, $password); 
$charset = mysql_client_encoding($connection); 
$flagChange = mysql_set_charset('utf8', $connection); 
echo "The character set is: $charset</br>mysql_set_charset result:$flagChange</br>"; 
Các vấn đề liên quan