2010-05-08 6 views

Trả lời

11

"Unicode" không phải là mã hóa. Bạn có thể có nghĩa là UTF-8 so với UTF-16 (big-endian hoặc little-endian). Nó thực sự không quan trọng nhiều cho hỗ trợ trình duyệt. Mọi trình duyệt hiện đại đều hỗ trợ cả ba. Có thể bạn sẽ thấy UTF-8 là không gian hiệu quả nhất cho cơ sở dữ liệu của bạn.

+0

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

+0

@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. –

+0

Xem http://stackoverflow.com/questions/643694/utf-8-vs-unicode để biết thêm chi tiết về thuật ngữ. –

3

UTF-8 mã hóa Unicode. Có thể bạn muốn chọn giữa UTF-8 và UTF-16.

Microsoft recommends rằng

Developers nên sử dụng UTF-8 cho tất cả các dữ liệu Unicode mà họ gửi đến và nhận được từ trình duyệt.

Để lưu trữ cơ sở dữ liệu, hãy sử dụng mã hóa RDBMS của bạn có hỗ trợ tốt hơn. Hoặc, tất cả đều bình đẳng, chọn dựa trên hiệu quả không gian. UTF-8 là nhỏ hơn cho tiếng Anh và hầu hết các ngôn ngữ châu Âu, trong khi UTF-16 có xu hướng nhỏ hơn cho các ngôn ngữ châu Á.

6

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ó.)

+1

+1 cho giải thích về UTF- *, -1 để ngăn cản việc sử dụng PHP hoàn toàn cho các ứng dụng i18n. Miễn là bạn biết rằng bạn cần sử dụng các hàm 'mb_' để xử lý chuỗi khi nó quan trọng, PHP hoàn toàn thích hợp cho các ứng dụng i18n. Đây không phải là một tiêu chí cho hay chống lại nó. – deceze

+2

Đầy đủ, có, nhưng không phải là IMO lựa chọn tốt nhất. – Wyzard

+0

Thực tế tôi thấy một số điểm trong seeng trong 3 chữ cái ... Bởi vì nếu bạn đặt 大 vào DB DB của bạn sẽ không nghĩ đến 大 như 1 ANCII Charecter ... – Rella

0

Nó là tốt hơn để sử dụng UTF-8, vì trong đó đề cập dấu tất cả của ngôn ngữ trên thế giới. Ngoài ra, UTF-8 cũng có một điều khoản mở rộng để thêm nhiều ký tự không được sử dụng hoặc nhận dạng. Tôi thích và sử dụng luôn UTF-8 và hàng loạt của nó.

3

Unicode là tiêu chuẩn xác định một loạt các ký tự trừu tượng (được gọi là điểm mã) và thuộc tính của chúng (là chữ số, chữ hoa, v.v ...). Nó cũng định nghĩa các mã hóa nhất định (các phương thức biểu diễn các ký tự có byte), UTF-8 là một trong số chúng. Xem The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) bởi Spolsky để biết thêm chi tiết. Tôi chắc chắn sẽ đi với UTF-8, nó là tiêu chuẩn ở khắp mọi nơi những ngày này, và có một số tính chất tốt đẹp như để lại tất cả các ký tự ASCII 7-bit tại chỗ, có nghĩa là hầu hết các chức năng liên quan đến HTML như htmlspecialchars có thể được sử dụng trực tiếp trên biểu diễn UTF-8, vì vậy bạn có ít cơ hội để lại các lỗ hổng bảo mật liên quan đến mã hóa. Ngoài ra, rất nhiều hàm PHP rõ ràng mong đợi các chuỗi UTF-8 và UTF-8 có hỗ trợ soạn thảo văn bản tốt hơn so với các lựa chọn thay thế như UTF-16.