Sự khác biệt định dạng Unicode, UTF, ASCII, ANSI


351

Phần chênh lệch giữa là gì Unicode, UTF8, UTF7, UTF16, UTF32, ASCII, và ANSImã hóa?

Những cách này hữu ích cho các lập trình viên?


Trang web tốt nhất để giới thiệu sẽ là: msdn.microsoft.com/en-us/l
Library / dd374081 (VS85) .aspx

6
rất liên quan: UTF-8 vs Unicode
Tobias Kienzler


Câu trả lời:


470

Đi xuống danh sách của bạn:

  • " Unicode " không phải là mã hóa, mặc dù không may, rất nhiều tài liệu sử dụng nó không chính xác để chỉ bất kỳ mã hóa Unicode nào mà hệ thống cụ thể sử dụng theo mặc định. Trên Windows và Java, điều này thường có nghĩa là UTF-16; ở nhiều nơi khác, nó có nghĩa là UTF-8. Chính xác, Unicode đề cập đến chính bộ ký tự trừu tượng, không phải bất kỳ mã hóa cụ thể nào.
  • UTF-16 : 2 byte cho mỗi "đơn vị mã". Đây là định dạng gốc của các chuỗi trong .NET và nói chung trong Windows và Java. Các giá trị bên ngoài Mặt phẳng đa ngôn ngữ cơ bản (BMP) được mã hóa thành các cặp thay thế. Chúng từng được sử dụng tương đối hiếm khi được sử dụng, nhưng bây giờ nhiều ứng dụng tiêu dùng sẽ cần phải biết về các ký tự không phải BMP để hỗ trợ biểu tượng cảm xúc.
  • UTF-8 : Mã hóa độ dài thay đổi, 1-4 byte cho mỗi điểm mã. Các giá trị ASCII được mã hóa dưới dạng ASCII bằng 1 byte.
  • UTF-7 : Thường được sử dụng để mã hóa thư. Rất có thể nếu bạn nghĩ rằng bạn cần nó và bạn không làm thư, bạn đã sai. (Đó chỉ là kinh nghiệm của tôi về những người đăng bài trong các nhóm tin tức, v.v. - ngoài thư, nó thực sự không được sử dụng rộng rãi.)
  • UTF-32 : Đã sửa lỗi mã hóa độ rộng bằng 4 byte cho mỗi điểm mã. Điều này không hiệu quả lắm, nhưng làm cho cuộc sống bên ngoài BMP dễ dàng hơn. Tôi có một Utf32Stringlớp .NET là một phần của thư viện MiscUtil của tôi , nếu bạn muốn. (Nó không được kiểm tra kỹ lưỡng, nhớ bạn.)
  • ASCII : Mã hóa byte đơn chỉ sử dụng 7 bit dưới cùng. (Mã Unicode điểm 0-127.) Không có dấu, v.v.
  • ANSI: Không có ai mã hóa ANSI cố định - có rất nhiều trong số chúng. Thông thường khi mọi người nói "ANSI", họ có nghĩa là "ngôn ngữ / mã hóa mặc định cho hệ thống của tôi" được lấy thông qua Encoding.Default và thường là Windows-1252 nhưng có thể là các ngôn ngữ khác.

Có nhiều hơn trên trang Unicode của tôi và các mẹo để gỡ lỗi các vấn đề về Unicode .

Tài nguyên mã lớn khác là unicode.org chứa nhiều thông tin hơn bạn có thể thực hiện theo cách của mình - có thể bit hữu ích nhất là biểu đồ mã .


6
Thuật ngữ "ANSI" khi được áp dụng cho các trang mã 8 bit của Microsoft là một cách viết sai. Chúng dựa trên các bản nháp được gửi cho tiêu chuẩn hóa ANSI, nhưng bản thân ANSI không bao giờ tiêu chuẩn hóa chúng. Windows-1252 (trang mã thường được gọi là "ANSI") tương tự như ISO 8859-1 (Latin-1), ngoại trừ Windows-1252 có các ký tự có thể in trong phạm vi 0x80..0x9F, trong đó ISO 8859-1 có các ký tự điều khiển trong phạm vi đó. Unicode cũng có các ký tự điều khiển trong phạm vi đó. vi.wikipedia.org/wiki/Windows_code_page
Keith Thompson

1
@ jp2code: Tôi sẽ không - nhưng bạn cần phân biệt giữa "nội dung được gửi lại qua HTTP từ máy chủ web" và "nội dung được gửi qua email". Đây không phải là nội dung trang web gửi email - có lẽ là ứng dụng đằng sau nó. Nội dung web sẽ là tốt nhất trong UTF-8; nội dung thư có thể có trong UTF-7, mặc dù tôi nghi ngờ rằng việc giữ nó trong UTF-8 ngày nay là tốt.
Jon Skeet

2
Đối với UTF-16, IMHO, tôi sẽ nói "2 byte cho mỗi đơn vị mã" vì một điểm mã bên ngoài BMP sẽ được mã hóa theo cặp thay thế là 2 đơn vị mã (4 byte).
Ludovic Kuty

1
Thiếu sự khác biệt giữa UTF-16LE (trong .NET) và BE cũng như khái niệm về BOM.
Maarten Bodewes

2
@Andrew: Không, không có điểm đánh dấu mã hóa (chung). Windows 1252 không thể đại diện cho BOM Unicode và nó sẽ không có ý nghĩa vì dù sao nó chỉ là mã hóa một byte cho mỗi char.
Jon Skeet

68

Một số cách đọc để giúp bạn bắt đầu mã hóa ký tự: Joel trên Phần mềm: 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!)

Nhân tiện - ASP.NET không có gì để làm với nó. Mã hóa là phổ quát.


7
Đã trả lời ở đây 6 năm sau khi bài báo được viết. Tôi đọc nó 8 năm sau khi bài viết được viết. 14 năm sau và nó vẫn là một cuốn sách hay. Đó là hơn một nửa cuộc sống của tôi trước đây. Đáng kinh ngạc.
Dave Knise
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.