Sự khác biệt giữa UTF-8 và ISO-8859-1 là gì?


Câu trả lời:


321

UTF-8 là một mã hóa đa bào có thể đại diện cho bất kỳ ký tự Unicode nào. ISO 8859-1 là một mã hóa một byte có thể đại diện cho 256 ký tự Unicode đầu tiên. Cả hai đều mã hóa ASCII chính xác theo cùng một cách.


11
Một điều cần lưu ý là ASCII chỉ kéo dài từ 0 đến 127. MSB luôn là 0.
Hritik

3
Khi các điểm mã trên 127 được xác định, hệ thống mã hóa là phiên bản của Extended ASCII.
Rohan Bhale

1
@RohanBhale Đừng sử dụng cụm từ Extended ASCII; nó sẽ chỉ gây nhầm lẫn.
Ông Lister

Nhưng ascii mở rộng có thể là thuật ngữ chính xác. Tôi đọc nó trên nhiều tài nguyên
Rohan Bhale

135

Wikipedia giải thích cả hai cách hợp lý: UTF-8 so với Latin-1 (ISO-8859-1). Trước đây là mã hóa có độ dài thay đổi, mã hóa độ dài cố định một byte sau. Latin-1 chỉ mã hóa 256 điểm mã đầu tiên của bộ ký tự Unicode, trong khi UTF-8 có thể được sử dụng để mã hóa tất cả các điểm mã. Ở cấp độ mã hóa vật lý, chỉ các điểm mã 0 - 127 được mã hóa giống hệt nhau; điểm mã 128 - 255 khác nhau bằng cách trở thành chuỗi 2 byte với UTF-8 trong khi chúng là các byte đơn với Latin-1.


@mu có thể câu lệnh của tôi không rõ ràng, nhưng nó không sai - Tôi không nói về các chuỗi byte được mã hóa, mà là các bộ ký tự được mã hóa; có nghĩa là ISO-8859-1 được sử dụng để mã hóa 256 điểm mã đầu tiên của bộ ký tự Unicode.
StaxMan

Làm rõ của bạn làm việc cho tôi và "mơ hồ" sẽ là một lựa chọn từ tốt hơn so với "không chính xác".
mu quá ngắn

83

UTF

UTF là một nhóm các lược đồ mã hóa nhiều byte có thể biểu thị các điểm mã Unicode có thể đại diện cho tối đa 2 ^ 31 [khoảng 2 tỷ] ký tự. UTF-8 là một hệ thống mã hóa linh hoạt, sử dụng từ 1 đến 4 byte để thể hiện các điểm mã 2 ^ 21 [khoảng 2 triệu] đầu tiên.

Câu chuyện dài: bất kỳ ký tự nào có đại diện điểm mã / thứ tự dưới 127, hay còn gọi là ASCII 7 bit an toàn được biểu diễn bằng cùng một chuỗi 1 byte như hầu hết các mã hóa byte đơn khác. Bất kỳ ký tự nào có điểm mã trên 127 được biểu thị bằng một chuỗi gồm hai byte trở lên, với các chi tiết của mã hóa được giải thích tốt nhất ở đây .

ISO-8859

ISO-8859 là một họ các lược đồ mã hóa một byte được sử dụng để biểu diễn các bảng chữ cái có thể được biểu diễn trong phạm vi từ 127 đến 255. Các bảng chữ cái khác nhau này được định nghĩa là "các phần" theo định dạng ISO-8859- n , quen thuộc nhất trong những thứ này có thể là ISO-8859-1 hay còn gọi là 'Latin-1'. Như với UTF-8, ASCII 7 bit an toàn vẫn không bị ảnh hưởng bất kể họ mã hóa được sử dụng.

Hạn chế của sơ đồ mã hóa này là không có khả năng chứa các ngôn ngữ bao gồm hơn 128 ký hiệu hoặc hiển thị một cách an toàn nhiều hơn một họ ký hiệu cùng một lúc. Đồng thời, mã hóa ISO-8859 đã không còn được ưa chuộng với sự gia tăng của UTF. "Nhóm công tác" ISO chịu trách nhiệm về việc đã tan rã vào năm 2004, để lại bảo trì cho tiểu ban mẹ của nó.


1
+1 để trả lời câu hỏi nhưng đi xa hơn và cung cấp thông tin về các bảng mã liên quan. Re: điểm mã cho UTF-8, theo stackoverflow.com/a/38488353/3353984 , UTF-8 hỗ trợ 2 ^ 21 điểm mã. Đó có phải là một lỗi, hoặc có thể cần phải sửa chữa ở đây?
Tom Loredo

1
Unicode thực sự là 17 mặt phẳng của 2 ^ 16 điểm mã. 0x00_0000 đến 0x1F_FFFF. 17 mặt phẳng có thể chứa 1.114.112 điểm mã. Trong số này, 2.048 là người thay thế, 66 người không phải là nhân vật và 137.468 được dành riêng cho sử dụng cá nhân, để lại 974,530 cho nhiệm vụ công cộng.about 1 triệu. Xem UTF-8 có thể mã hóa bao nhiêu ký tự? .
georgeawg

22
  • ASCII: 7 bit. 128 điểm mã.

  • ISO-8859-1: 8 bit. 256 điểm mã.

  • UTF-8: 8-32 bit (1-4 byte). 1.112.064 điểm mã.

Cả ISO-8859-1 và UTF-8 đều tương thích ngược với ASCII, nhưng UTF-8 không tương thích ngược với ISO-8859-1:

#!/usr/bin/env python3

c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))

Đầu ra:

©
b'\xc2\xa9'
b'\xa9'

21

ISO-8859-1 là một tiêu chuẩn kế thừa từ những năm 1980. Nó chỉ có thể đại diện cho 256 ký tự nên chỉ phù hợp với một số ngôn ngữ trong thế giới phương tây. Ngay cả đối với nhiều ngôn ngữ được hỗ trợ, một số ký tự bị thiếu. Nếu bạn tạo một tệp văn bản trong bảng mã này và thử sao chép / dán một số ký tự tiếng Trung, bạn sẽ thấy kết quả kỳ lạ. Nói cách khác, đừng sử dụng nó. Unicode đã chiếm lĩnh thế giới và UTF-8 có khá nhiều tiêu chuẩn hiện nay trừ khi bạn có một số lý do kế thừa (như tiêu đề HTTP cần tương thích với mọi thứ).


1
Tôi đã thấy nơi Umlaut không được chuyển đổi với UTF8. Chúng tôi đã thấy các ví dụ về điều này và khi tìm kiếm, chúng tôi đã tìm thấy ISO-8859-1 và nó dường như hoạt động. Chúng tôi có rất nhiều Nhà khoa học người Đức mà chúng tôi làm việc cùng.
Aggie Jon của 87

4
Umlaut được thể hiện là hai nhân vật trong utf8. Họ chuyển đổi tốt và làm việc tốt. Vấn đề xuất phát từ các chương trình mong đợi 1 byte cho mỗi ký tự. Đối với các chương trình cũ này, ISO-8859-1 có âm lượng 1 byte.
Erik Aronesty

3

Từ góc nhìn khác, các tệp mà cả mã hóa unicode và ascii đều không đọc được vì chúng có một byte 0xc0trong đó, dường như được đọc bởi iso-8859-1 đúng cách. Thông báo trước là tập tin không nên có các ký tự unicode trong đó.


2

Một điều quan trọng hơn để nhận ra: nếu bạn thấy iso-8859-1, nó có thể đề cập đến Windows-1252 chứ không phải ISO / IEC 8859-1 . Chúng khác nhau trong phạm vi 0x80 Hay0x9F, trong đó ISO 8859-1 có mã điều khiển C1 và Windows-1252 có các ký tự hiển thị hữu ích thay thế.

Ví dụ: ISO 8859-1 có 0x85 là ký tự điều khiển (bằng Unicode, U + 0085, ``), trong khi Windows-1252 có dấu chấm lửng ngang (trong Unicode, U + 2026 HORIZONTAL ELLIPSIS, ).

Thông số mã hóa WHATWG (như được sử dụng bởi HTML) rõ ràng tuyên bố iso-8859-1là nhãn cho windows-1252và các trình duyệt web không hỗ trợ ISO 8859-1 theo bất kỳ cách nào: thông số HTML nói rằng tất cả các mã hóa trong thông số Mã hóa phải được hỗ trợ và không còn nữa .

Ngoài ra, các tham chiếu ký tự số HTML về cơ bản sử dụng Windows-1252 cho các giá trị 8 bit thay vì các điểm mã Unicode; mỗi https://html.spec.whatwg.org/#numeric-character-reference-end-state ,… sẽ tạo ra U + 2026 thay vì U + 0085.


Giáo sư! Nghĩ rằng tôi đã viết nó, nhưng tôi đã mất nó trong một bản viết lại. Tôi đã đặt nó vào bây giờ.
Chris Morgan

0

Lý do của tôi để nghiên cứu câu hỏi này là từ quan điểm, là cách chúng tương thích với nhau. Bộ ký tự Latin1 (iso-8859) tương thích 100% để được lưu trữ trong kho dữ liệu utf8. Tất cả các ký tự ascii & Extended-ascii sẽ được lưu trữ dưới dạng một byte.

Đi theo một cách khác, từ bộ ký tự utf8 đến Latin1 có thể hoặc không thể hoạt động. Nếu có bất kỳ ký tự 2 byte nào (ký tự vượt quá 255-ascii 255), chúng sẽ không lưu trữ trong kho dữ liệu Latin1.


2
Hữu ích, nhưng tôi nghĩ bạn có nghĩa là 127 thay vì 255 trong 255-ascii mở rộng?
Hydroper

18
Latin-1 hoặc iso-8859-1 không tương thích 100% sẽ được lưu trữ trong utf8. Bất kỳ ký tự Latin-n hoặc iso-8859-n nào trên 127 sẽ không được dịch sang một ký tự utf-8 byte đơn. Tuy nhiên, đối với các giá trị 1-127, chúng sẽ dịch chính xác.
Marlin Pierce

4
Câu trả lời này hơi khó hiểu khi sử dụng thuật ngữ "ascii mở rộng", đây chỉ là một thuật ngữ để chỉ bất kỳ mã hóa ký tự nào không phải là ASCII. UTF-8 và latin-1 là các ví dụ về mã hóa ASCII mở rộng. Nhưng, các ký tự Latin-1 không phải ascii (ví dụ: các điểm mã trên 127) không thể được mã hóa dưới dạng một byte trong UTF-8.
rdb
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.