UTF-8 là mã hóa Unicode, một cách biểu diễn chuỗi (ký tự) trừu tượng của các ký tự Unicode dưới dạng một chuỗi byte (cụ thể). Có mã hóa khác, chẳng hạn như UTF-16 (trong đó có cả hai phiên bản lớn và cuối cùng). Cả UTF-8 và UTF-16 có thể đại diện cho bất kỳ ký tự nào trong Unicode, vì vậy bạn có thể hỗ trợ tất cả các ngôn ngữ bất kể bạn chọn ngôn ngữ nào.
UTF-8 rất hữu ích nếu hầu hết văn bản của bạn bằng tiếng Tây Ban Nha vì nó đại diện cho các ký tự ASCII chỉ trong một byte, nhưng cần ba byte cho nhiều ký tự trong bảng chữ cái "nước ngoài" như tiếng Trung. UTF-16, mặt khác, sử dụng chính xác hai byte cho tất cả các ký tự mà bạn có khả năng gặp phải (mặc dù một số ký tự rất bí truyền, bên ngoài "Basic Multilingual Plane" của Unicode, yêu cầu bốn).
Tôi sẽ không khuyên bạn nên sử dụng PHP để phát triển phần mềm quốc tế, tuy nhiên, vì nó không thực sự hỗ trợ Unicode đúng cách. Nó có một số hàm bổ sung để làm việc với mã hóa Unicode (xem các hàm multibyte string), nhưng lõi PHP coi chuỗi là byte, không phải ký tự, vì vậy các hàm chuỗi PHP chuẩn không phù hợp để làm việc với các ký tự được mã hóa nhiều hơn một byte. Ví dụ, nếu bạn gọi strlen()
của PHP trên một chuỗi có chứa biểu diễn UTF-8 của ký tự "大", nó sẽ trả về 3, vì ký tự đó chiếm 3 byte trong UTF-8, mặc dù nó chỉ là một ký tự. Sử dụng các hàm chia tách chuỗi như substr()
là bấp bênh vì nếu bạn chia tách ở giữa ký tự nhiều byte, bạn đã làm hỏng chuỗi.
Hầu hết các ngôn ngữ khác được sử dụng để phát triển Web, như Java, C# và Python, đều có hỗ trợ Unicode, để bạn có thể đặt các ký tự Unicode tùy ý vào chuỗi và không cần phải lo lắng về việc sử dụng mã hóa nào để đại diện cho chúng trong bộ nhớ vì từ quan điểm của bạn, một chuỗi chứa các ký tự chứ không phải các byte. Đây là cách an toàn hơn, ít bị lỗi hơn khi làm việc với văn bản Unicode. Vì lý do này và các lý do khác (PHP không thực sự là một ngôn ngữ tuyệt vời), tôi khuyên bạn nên sử dụng cái gì khác.
(Tôi đã đọc rằng PHP 6 sẽ có hỗ trợ Unicode đúng, nhưng đó là chưa có.)
Thực ra trong thuật ngữ Unicode Unicode là mã hóa và UTF-8 và UTF-16 là "định dạng chuyển đổi". Tốt nhất là hãy lưu ý rằng mã hóa "thuật ngữ" được sử dụng khác trong trường hợp phổ biến so với trường hợp Unicode cụ thể. – hippietrail
@hippie, nó không giống như [thuật ngữ Unicode] (http://unicode.org/glossary/) xác định thuật ngữ "Mã hóa" một mình. Tuy nhiên, tôi đồng ý có những cách sử dụng khác nhau. –
Xem http://stackoverflow.com/questions/643694/utf-8-vs-unicode để biết thêm chi tiết về thuật ngữ. –