Unicode, Unicode Big Endian hay UTF-8? Sự khác biệt là gì? Định dạng nào tốt hơn?


19

Khi tôi cố lưu tệp văn bản có văn bản không phải tiếng Anh trong Notepad, tôi có một tùy chọn để chọn giữa Unicode , Unicode Big EndianUTF-8 . Sự khác biệt giữa các định dạng này là gì?

Giả sử tôi không muốn bất kỳ khả năng tương thích ngược nào (với các phiên bản hoặc ứng dụng HĐH cũ hơn) và tôi không quan tâm đến kích thước tệp, định dạng nào trong số này là tốt hơn?

(Giả sử rằng văn bản có thể bằng các ngôn ngữ như tiếng Trung hoặc tiếng Nhật, ngoài các ngôn ngữ khác.)

Lưu ý: Từ các câu trả lời và nhận xét bên dưới, có vẻ như trong biệt ngữ Notepad, Unicode là UTF-16 (Little Endian), Unicode Big Endian là UTF-16 (Big Endian) và UTF-8 cũng là UTF-8.


Câu trả lời:


19

Dunno. Cái nào tốt hơn: cưa hay búa? :-)

Unicode không phải là UTF

Có một chút trong bài viết có liên quan nhiều hơn đến chủ đề trong tay:

  • UTF-8 tập trung vào việc giảm thiểu kích thước byte để thể hiện các ký tự từ bộ ASCII (biểu diễn độ dài thay đổi: mỗi ký tự được biểu thị trên 1 đến 4 byte và tất cả các ký tự ASCII đều khớp với 1 byte). Như Joel nói:

Họ nhìn vào tất cả những con số không! Họ nói, vì họ là người Mỹ và họ đang xem văn bản tiếng Anh hiếm khi sử dụng điểm mã trên U + 00FF. Ngoài ra, họ là những người híp-pi tự do ở California, những người muốn bảo tồn (người chế nhạo). Nếu họ là người Texas, họ sẽ không bận tâm gấp đôi số byte. Nhưng những người phù thủy ở California không thể chịu nổi ý tưởng nhân đôi số lượng lưu trữ cần thiết cho chuỗi

  • UTF-32 tập trung vào tính toàn diện và biểu diễn độ dài cố định, sử dụng 4 byte cho tất cả các ký tự. Đây là bản dịch đơn giản nhất, ánh xạ trực tiếp mã Unicode tới 4 byte. Rõ ràng, nó không hiệu quả lắm.

  • UTF-16 là một sự thỏa hiệp, sử dụng 2 byte hầu hết thời gian, nhưng mở rộng thành 2 * 2 byte cho mỗi ký tự để thể hiện một số ký tự nhất định, những ký tự không có trong Mặt phẳng đa ngôn ngữ cơ bản (BMP).

Đồng thời xem Tối thiểu tuyệt đối Mỗi nhà phát triển phần mềm Tuyệt đối, Tích cực phải biết về Unicode và Bộ ký tự (Không có lý do!)


4
Vấn đề xuất phát từ thực tế rằng Unicode là một 'mã hóa', nhưng không phải theo nghĩa số-thành-byte. UTF-8/16/32 là tất cả các bảng mã Unicode, nhưng bản thân Unicode là ánh xạ từ ký hiệu sang số. Tôi nghĩ họ có thể sử dụng thuật ngữ độc đáo hơn để tránh sự nhầm lẫn này.
jerryjvl

4
Mặc dù vậy, đối với OP của câu hỏi, tỷ lệ cược là ứng dụng có nghĩa là 'UTF-16' trong đó có chữ 'Unicode'.
jerryjvl

3
Tôi không chắc chắn rằng mục tiêu của UTF-8 là "bảo tồn" trái ngược với khả năng tương thích ngược với ASCII.
Ông Shiny và New

@Johannes: Hiệp hội Unicode đã quyết định không bao giờ gán các điểm mã trên U + 10FFFF vì chúng không thể được biểu diễn trong UTF-16. Điều này có tác dụng hạn chế UTF-8 đến 4 byte.
dùng46971

1
"Unicode không phải là UTF" - đối với nhiều người, đó là WTF;)
mlvljr

4

Đối với các ngôn ngữ châu Âu, UTF-8 nhỏ hơn. Đối với các ngôn ngữ phương Đông, sự khác biệt không quá rõ ràng.

Cả hai sẽ xử lý tất cả các ký tự Unicode có thể, do đó nó sẽ không tạo ra sự khác biệt về khả năng tương thích.


3

Có nhiều mã hóa ký tự Unicode hơn bạn nghĩ.

  • UTF 8

    Mã hóa UTF-8 có độ rộng thay đổi, dao động từ 1-4 byte, với các bit trên của mỗi byte được dành làm bit điều khiển. Các bit đầu của byte đầu tiên cho biết tổng số byte được sử dụng cho ký tự đó. Giá trị vô hướng của điểm mã của ký tự là nối các bit không điều khiển. Trong bảng này, xbiểu thị 8 bit thấp nhất của giá trị Unicode, ybiểu thị 8 bit cao hơn tiếp theo và zbiểu thị các bit cao hơn mức đó.

    Unicode              Byte1     Byte2     Byte3     Byte4
    U+0000-U+007F       0xxxxxxx            
    U+0080-U+07FF       110yyyxx  10xxxxxx          
    U+0800-U+FFFF       1110yyyy  10yyyyxx  10xxxxxx    
    U+10000-U+10FFFF    11110zzz  10zzyyyy  10yyyyxx  10xxxxxx
    
  • UCS-16
  • UCS-16BE
  • UCS-16LE

  • UTF-16
  • UTF-16BE
  • UTF-16LE

  • UTF-32
  • UTF-32-BE

1
Có nhiều mã hóa ký tự Unicode hơn bạn đã liệt kê. Ví dụ: UTF-1 , UTF-7 , UTF-EBCDIC , GB-18030 , MIME , UTF-9 và UTF-18 ... Bạn cũng có thể sử dụng bất kỳ sơ đồ mã hóa nhị phân nào để mã hóa dữ liệu Unicode. Đọc thêm So sánh các bảng mã Unicode
phuclv

1

"Unicode" là một thuật ngữ khác của "UTF-16", là một mã hóa của ký tự Unicode được đặt thành mười sáu bit cho mỗi ký tự. UTF-8 mã hóa nó thành tám bit cho mỗi ký tự.

Trong cả hai trường hợp, bất kỳ tràn nào được phân bổ cho 16 hoặc tám bit khác.


Cái nào tốt hơn rồi?
R. Martinho Fernandes

"nó phụ thuộc vào tình hình.
John Saunders

Mặc dù đối với câu hỏi cụ thể này, có vẻ như "Unicode" thực sự được hiểu là một thuật ngữ khác cho "UTF-16", nhưng nói chung không phải vậy - hãy xem câu trả lời của Jason.
Arjan

1
Bạn có nghĩa là "mỗi đơn vị mã", không phải "mỗi ký tự"; cả UTF-8 và UTF-16 đều có thể sử dụng nhiều đơn vị mã để thể hiện một ký tự. Và "Unicode" một "UTF-16" KHÔNG phải là điều tương tự, ngoại trừ trong thuật ngữ của Microsoft.
dùng46971

1

Lợi thế thực sự duy nhất với các tệp nhỏ như tệp văn bản là kích thước tệp kết quả. UTF-8 thường tạo ra các tệp nhỏ hơn. Nhưng sự khác biệt này có thể ít rõ rệt hơn với văn bản Trung Quốc / Nhật Bản.


Hãy nhớ rằng cũng có sự khác biệt về băng thông mạng và sử dụng bộ nhớ.
Jason Baker

1
"UTF-8 thường tạo ra các tệp nhỏ hơn": Nói chung không. UTF-8 tạo các tệp nhỏ hơn cho các tệp ASCII. Nếu một tệp chỉ bao gồm các điểm mã Unicode trên U + 0800, thì nó sẽ lớn hơn trong UTF-8 so với UTF-16.
sleske

0

Nói một cách dễ hiểu, Unicode là một bộ ký tự , trong khi Unicode Big Endian và utf-8 là hai bảng mã , được sử dụng để lưu trữ các ký tự dưới dạng 01 trên máy tính.


Và sự khác biệt là ...?
David Richerby
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.