Sự khác biệt giữa UTF và UCS là gì.
Mã hóa UCS có chiều rộng cố định và được đánh dấu bằng số byte được sử dụng cho mỗi ký tự. Ví dụ, UCS-2 yêu cầu 2 byte cho mỗi ký tự. Các ký tự có điểm mã ngoài phạm vi có sẵn không thể được mã hóa bằng mã hóa UCS.
Mã hóa UTF có chiều rộng thay đổi và được đánh dấu bằng số bit tối thiểu để lưu trữ một ký tự. Ví dụ, UTF-16 yêu cầu ít nhất 16 bit (2 byte) cho mỗi ký tự. Các ký tự có các điểm mã lớn được mã hóa bằng cách sử dụng số byte lớn hơn - 4 byte cho các ký tự astral trong UTF-16.
- đại diện nội bộ bên trong mã
- đại diện lưu trữ tốt nhất (ví dụ: Trong tập tin)
- nhất trên định dạng phương tiện giao thông dây (Chuyển giữa các ứng dụng có thể được trên kiến trúc khác nhau và có một miền địa phương tiêu chuẩn khác nhau)
Đối với hệ thống hiện đại, mã hóa lưu trữ và vận chuyển hợp lý nhất là UTF-8. Có những trường hợp đặc biệt mà những người khác có thể thích hợp - UTF-7 cho các máy chủ thư cũ, UTF-16 cho các trình soạn thảo văn bản kém được viết - nhưng UTF-8 là phổ biến nhất.
Biểu diễn nội bộ ưu tiên sẽ tùy thuộc vào nền tảng của bạn. Trong Windows, nó là UTF-16. Trong UNIX, nó là UCS-4. Mỗi điểm có các điểm tốt:
- Chuỗi UTF-16 không bao giờ sử dụng nhiều bộ nhớ hơn chuỗi UCS-4. Nếu bạn lưu trữ nhiều chuỗi lớn với các ký tự chủ yếu trong mặt phẳng đa ngôn ngữ cơ bản (BMP), UTF-16 sẽ yêu cầu ít không gian hơn UCS-4. Bên ngoài BMP, nó sẽ sử dụng cùng một số tiền.
- UCS-4 dễ hiểu hơn. Bởi vì các ký tự UTF-16 có thể được chia thành nhiều "cặp thay thế", nên có thể khó phân tách chính xác hoặc hiển thị một chuỗi. Văn bản UCS-4 không có vấn đề này. UCS-4 cũng hoạt động giống như văn bản ASCII trong mảng "char", vì vậy các thuật toán văn bản hiện tại có thể được chuyển dễ dàng.
Cuối cùng, một số hệ thống sử dụng UTF-8 làm định dạng nội bộ. Điều này là tốt nếu bạn cần liên kết với các hệ thống dựa trên ASCII hoặc ISO-8859 hiện tại vì các byte NULL không có mặt ở giữa văn bản UTF-8 - chúng nằm trong UTF-16 hoặc UCS-4.
Nguồn
2008-10-14 06:17:45
Không, mã hóa UTF không phải lúc nào cũng có chiều rộng thay đổi (ví dụ như UTF-32). – bortzmeyer
Utf-32 có thể sử dụng chiều rộng cố định cho mỗi điểm mã, nhưng tôi nghĩ * bạn vẫn có thể có (và cần chấp nhận và bình thường hóa một codepoint) nhiều điểm (khi bạn kết hợp các ký tự) đại diện cho một char/glyph hoàn chỉnh. Nếu vậy, UTF-32 không thực sự tốt hơn UTF-16. – Shadow2531
@bortzmeyer: UTF-32 thực sự chỉ là UCS-4 với một vài hạn chế bổ sung. Thành thật mà nói, tôi chưa bao giờ thấy UTF-32 được sử dụng * bất cứ nơi nào *, vì vậy tôi có xu hướng bỏ qua nó. –