Hỏi về charset Utf-8 và Utf-16

Mình có đọc qua định nghĩa và ví dụ rồi, nhưng mình vẫn chưa hiểu rõ về nó và thế mạnh và yếu của 2 loại ạ.
Xin mọi người link hoặc câu trả lời nào đó dành cho kẻ ngốc cũng hiểu ạ :3 Cám ơn nhiều!!!

Cả hai đơn giản chỉ là các loại bảng mã unicode thôi, khác biệt ở cách chúng lưu trữ các kí tự.

  • UTF-8 lưu theo kiểu tăng dần số bit, kiểu như 128 kí tự đầu lưu ở dạng 8 bit, rồi mấy chục ngàn kí tự tiếp theo thì tăng số bit lên 16, 32,… tùy vào kí tự. Nói chung là kí tự càng về cuối thì tốn nhiều bit hơn để lưu.
  • Còn UTF-16 thì khác, kí tự nào cũng dùng 2 bytes (16 bit) để lưu cả.

UTF-8 thì phổ biến hơn vì nó gọn hơn và gần như thành chuẩn rồi, độ tương thích cao hơn. Còn UTF-16 thì ít thấy dùng.

5 Likes

http://utf8everywhere.org

2 Likes

UTF-16 dùng 2 bytes hoặc 4 bytes nha, ko phải ký tự nào cũng 2 bytes đâu. UCS-2 mới có đúng 2 bytes, và UCS-2 ko encode được tất cả các ký tự Unicode. UTF-16 nó dùng rất nhiều :V Windows sử dụng UTF-16 cho tên file nè :V :V Vậy là nó chiếm khoảng 80-90% máy tính cá nhân rồi :V Thêm ông Java string cũng xài UTF-16, mà Android xài Java, vậy là chiếm thị phần smartphone chắc cũng hơn 50% rồi :V

một vài ưu/nhược điểm của 2 charset:

  • Ưu điểm lớn nhất của UTF-8 là backward compatible với ASCII. Nghĩa là ký tự 7/8-bit cũng chỉ cần đúng 8-bit trong bộ nhớ. Vì vậy nó rất tiết kiệm bộ nhớ với văn bản có nhiều ký tự ASCII, ví dụ như HTML. Vì vậy web xài UTF-8 rất nhiều.
  • Nhược điểm lớn nhất của UTF-8 là multibyte charset: 1 ký tự có thể bị biểu diễn thành 8/16/24/32 bit, vì vậy ko thể xài s[i] O(1) được :V
  • Ưu điểm lớn nhất của UTF-16 là truy cập s[i] O(1), tuy rằng nó ko đảm bảo 100% s[i] là ký tự thứ i (vì có thể có các ký tự cần 4 bytes để biểu diễn). Tuy ko đúng 100% nhưng có thể nói là đúng 90%-95% :V vì ký tự Unicode sử dụng nhiều nhất là các ký tự được lưu ở dạng 2 bytes :V
  • Nhược điểm của UTF-16 là ko tương thích với ASCII :V :V ví dụ chuỗi “abc” UTF-16 LE (little-endian) nó lưu là “a\0b\0c\0” thì C-string nó đọc vào chỉ có “a” vì ký tự \0 C-string hiểu là NULL là kết thúc chuỗi :V Ngoài ra lưu trữ chuỗi Unicode với UTF-16 tốn nhiều bộ nhớ hơn so với UTF-8 (trừ các văn bản Đông Á thì phải :V), và khi lưu còn vướng endianess :V hiểu endianess giống như viết ngày: ngày trước tháng sau hay tháng trước ngày sau. Vì ký tự lưu với charset UTF-16 có 2 bytes là 0xXXYY thì viết là XXYY hay YYXX? (Với các ký tự cần 4 bytes thì chia ra 2 ký tự 2 bytes: X1X1Y1Y1X2X2Y2Y2 hay Y1Y1X1X1Y2Y2X2X2).
9 Likes

Tôi phục bác đấy :smiley: Mới biết windows lưu tên file bằng UTF-16, trước giờ cứ tưởng nó dùng UTF-8.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?