Sự khác biệt giữa ASCII và Unicode là gì?


407

Sự khác biệt chính xác giữa Unicode và ASCII là gì?

ASCII có tổng cộng 128 ký tự (256 trong bộ mở rộng).

Có đặc điểm kích thước nào cho các ký tự Unicode không?




Câu trả lời:


534

ASCII định nghĩa 128 ký tự, ánh xạ tới các số 0 Hồi127. Unicode định nghĩa (ít hơn) 2 21 ký tự, tương tự, ánh xạ tới các số 0 mộc2 21 (mặc dù hiện tại không phải tất cả các số đều được gán và một số được bảo lưu).

Unicode là siêu ký tự của ASCII và các số 0 Hồi127 có cùng ý nghĩa với ASCII như trong Unicode. Ví dụ: số 65 có nghĩa là "vốn Latin 'A'".

Do các ký tự Unicode thường không vừa với một byte 8 bit, nên có nhiều cách lưu trữ các ký tự Unicode theo chuỗi byte, chẳng hạn như UTF-32 và UTF-8.


4
@riderBill: Gì bây giờ? Bạn đang nói về 3 bit nào? Không có bit nào trong Unicode. Chỉ cần mật mã.
Kerrek SB

@riderBill: một lần nữa: bạn đang nói về "3 byte" nào? :-) (Không có gì trong số này phải làm với Unicode. Unicode chỉ liên quan đến việc gán ý nghĩa cho các số, không phải là về bit và byte.)
Kerrek SB

8
@riderBill: Unicode không "sử dụng từ 1 đến 4 byte". Unicode là một sự gán ý nghĩa cho các con số. Nó không sử dụng bất kỳ byte nào. Có một số lược đồ mã hóa được tiêu chuẩn hóa nhất định để biểu diễn các điểm mã Unicode dưới dạng luồng byte, nhưng chúng trực giao với Unicode dưới dạng một bộ ký tự. (Có, vui lòng xóa tùy ý.)
Kerrek SB

@CleanCrispCode Unicode thực sự là một siêu bộ của ISO-8859-1 , bản thân nó là một siêu bộ của ASCII. Đôi khi điều đó hữu ích để biết.
Đánh dấu tiền chuộc

8
Để làm rõ, Unicode ký tự chính nó là một superset của tiêu chuẩn ISO-8859-1 bộ ký tự , nhưng UTF-8 mã hóakhông một superset của tiêu chuẩn ISO-8859-1 mã hóa nhưng ASCII mã hóa .
minmaxavg

393

Hiểu tại sao ASCII và Unicode được tạo ra ngay từ đầu đã giúp tôi hiểu được sự khác biệt giữa hai loại này.

ASCII, nguồn gốc

Như đã nêu trong các câu trả lời khác, ASCII sử dụng 7 bit để thể hiện một ký tự. Bằng cách sử dụng 7 bit, chúng ta có thể có tối đa 2 ^ 7 (= 128) kết hợp riêng biệt * . Điều đó có nghĩa là chúng ta có thể đại diện tối đa 128 ký tự.

Chờ đã, 7 bit? Nhưng tại sao không phải 1 byte (8 bit)?

Bit cuối cùng (thứ 8) được sử dụng để tránh lỗi là bit chẵn lẻ . Điều này có liên quan nhiều năm trước.

Hầu hết các ký tự ASCII là các ký tự có thể in được của bảng chữ cái như abc, ABC, 123 ,? &!, V.v. Các ký tự khác là các ký tự điều khiển như trả về vận chuyển, nguồn cấp dữ liệu , tab, v.v.

Xem bên dưới biểu diễn nhị phân của một vài ký tự trong ASCII:

0100101 -> % (Percent Sign - 37)
1000001 -> A (Capital letter A - 65)
1000010 -> B (Capital letter B - 66)
1000011 -> C (Capital letter C - 67)
0001101 -> Carriage Return (13)

Xem bảng ASCII đầy đủ ở đây .

ASCII chỉ dành cho tiếng Anh.

Gì? Tại sao chỉ có tiếng Anh? Có rất nhiều ngôn ngữ ngoài kia!

Bởi vì trung tâm của ngành công nghiệp máy tính là ở Hoa Kỳ vào thời điểm đó. Kết quả là, họ không cần phải hỗ trợ các dấu hoặc các dấu khác như á, ü, ç, ñ, v.v. (còn gọi là dấu phụ ).

ASCII mở rộng

Một số người thông minh bắt đầu sử dụng bit thứ 8 (bit được sử dụng cho tính chẵn lẻ) để mã hóa nhiều ký tự hơn để hỗ trợ ngôn ngữ của họ (để hỗ trợ "é", ví dụ bằng tiếng Pháp). Chỉ cần sử dụng thêm một bit nhân đôi kích thước của bảng ASCII ban đầu để ánh xạ tối đa 256 ký tự (2 ^ 8 = 256 ký tự). Và không phải 2 ^ 7 như trước (128).

10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)

Tên của "ASCII này được mở rộng thành 8 bit chứ không phải 7 bit như trước" có thể chỉ được gọi là "ASCII mở rộng" hoặc "ASCII 8 bit".

Như @Tom đã chỉ ra trong bình luận của mình bên dưới, không có thứ gọi là " ASCII mở rộng ", đây là một cách dễ dàng để tham khảo thủ thuật 8 bit này. Có nhiều biến thể của bảng ASCII 8 bit, ví dụ, ISO 8859-1, còn được gọi là ISO Latin-1 .

Unicode, sự trỗi dậy

ASCII Extended giải quyết vấn đề cho các ngôn ngữ dựa trên bảng chữ cái Latinh ... còn những ngôn ngữ khác cần một bảng chữ cái hoàn toàn khác thì sao? Người Hy Lạp? Tiếng Nga? Tiếng Trung và thích?

Chúng tôi sẽ cần một bộ ký tự hoàn toàn mới ... đó là lý do đằng sau Unicode. Unicode không chứa mọi ký tự từ mọi ngôn ngữ, nhưng chắc chắn nó chứa một lượng ký tự khổng lồ ( xem bảng này ).

Bạn không thể lưu văn bản vào ổ cứng dưới dạng "Unicode". Unicode là một đại diện trừu tượng của văn bản. Bạn cần "mã hóa" biểu diễn trừu tượng này. Đó là nơi mã hóa phát huy tác dụng.

Mã hóa: UTF-8 so với UTF-16 so với UTF-32

Câu trả lời này thực hiện một công việc khá tốt trong việc giải thích những điều cơ bản:

  • UTF-8 và UTF-16 là các bảng mã có độ dài thay đổi.
  • Trong UTF-8, một ký tự có thể chiếm tối thiểu 8 bit.
  • Trong UTF-16, độ dài ký tự bắt đầu bằng 16 bit.
  • UTF-32 là mã hóa có độ dài cố định 32 bit.

UTF-8 sử dụng bộ ASCII cho 128 ký tự đầu tiên. Điều đó rất tiện lợi vì điều đó có nghĩa là văn bản ASCII cũng hợp lệ trong UTF-8.

Ghi nhớ:

  • UTF- 8 : tối thiểu 8 bit.
  • UTF- 16 : tối thiểu 16 bit.
  • UTF- 32 : tối thiểu và tối đa 32 bit.

Ghi chú:

Tại sao 2 ^ 7?

Điều này là rõ ràng đối với một số, nhưng chỉ trong trường hợp. Chúng tôi có bảy vị trí có sẵn được điền bằng 0 hoặc 1 ( Mã nhị phân ). Mỗi có thể có hai kết hợp. Nếu chúng ta có bảy điểm, chúng ta có 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128 kết hợp. Hãy nghĩ về điều này như một khóa kết hợp với bảy bánh xe, mỗi bánh chỉ có hai số.

Nguồn: Wikipedia , bài đăng blog tuyệt vời nàyMocki nơi tôi ban đầu đăng bản tóm tắt này.


7
Không có văn bản nhưng văn bản được mã hóa. Một số mã hóa rất đơn giản, đặc biệt đối với các bộ ký tự có <= 256 điểm mã. "ASCII mở rộng" là một thuật ngữ rất mơ hồ; có một số hỗ trợ tiếng Hy Lạp, tiếng Nga và / hoặc tiếng Ba Lan. ASCII không đủ cho văn bản tiếng Anh, vốn sử dụng á, ü, ç, ñ. Tôi nghi ngờ rằng nó được thiết kế để hỗ trợ ngôn ngữ máy tính hơn là ngôn ngữ của con người. Giáo điều, khi bạn viết một tập tin hoặc luồng, bạn có một bộ ký tự và chọn một mã hóa. Người đọc của bạn phải có được các byte và kiến ​​thức về mã hóa. Nếu không, giao tiếp đã thất bại.
Tom Blodget

Cảm ơn bạn rất nhiều cho phần phụ lục. Tôi cập nhật câu trả lời cho phù hợp.
Andrew

Cảm ơn bạn. Tôi nhận thấy ở khắp mọi nơi bảng ASCII hiển thị mã ký tự là 0-127 nhưng bảng UTF-8 hiển thị mã dưới dạng hex và không phải là số nguyên. Có một lý do cho điều này? Tại sao các bảng UTF-X không hiển thị 0-127 / 255/ 65535 so với 00-AF? Điều này có ý nghĩa gì không?
wayofthefuture

Cảm ơn bạn đã trả lời. Câu hỏi nhanh: 'Trong UTF-16, độ dài ký tự bắt đầu bằng 16 bit' - Điều này có nghĩa là các ký tự chữ và số không thể được biểu thị bằng UTF-16 vì chúng chỉ có các ký tự 8 bit?
Moondra

Câu trả lời tuyệt vời, chỉ có tôi có một vấn đề - Ba Lan có thực sự sử dụng một bảng chữ cái khác không? Tôi nghĩ rằng chúng tôi sử dụng cùng một tiếng Anh, chỉ với một số chữ cái bổ sung?
Nicofisi

89

ASCII có 128 điểm mã, từ 0 đến 127. Nó có thể vừa với một byte 8 bit, các giá trị 128 đến 255 có xu hướng được sử dụng cho các ký tự khác. Với các lựa chọn không tương thích, gây ra thảm họa trang mã . Văn bản được mã hóa trong một trang mã không thể được đọc chính xác bởi một chương trình giả định hoặc đoán tại trang mã khác.

Unicode đã đến để giải quyết thảm họa này. Phiên bản 1 bắt đầu với 65536 điểm mã, thường được mã hóa thành 16 bit. Sau đó mở rộng trong phiên bản 2 lên 1,1 triệu điểm mã. Phiên bản hiện tại là 6.3, sử dụng 110.187 trong số 1,1 triệu điểm mã có sẵn. Điều đó không còn phù hợp với 16 bit nữa.

Mã hóa trong 16 bit là phổ biến khi v2 xuất hiện, được sử dụng bởi hệ điều hành Microsoft và Apple chẳng hạn. Và thời gian chạy ngôn ngữ như Java. Thông số kỹ thuật v2 đã đưa ra một cách để ánh xạ 1,1 triệu điểm mã đó thành 16 bit. Một mã hóa được gọi là UTF-16, một mã hóa có độ dài thay đổi trong đó một điểm mã có thể mất 2 hoặc 4 byte. Các điểm mã v1 gốc mất 2 byte, các điểm được thêm mất 4.

Một mã hóa độ dài biến khác rất phổ biến, được sử dụng trong các hệ điều hành và công cụ * nix là UTF-8, một điểm mã có thể mất từ ​​1 đến 4 byte, mã ASCII ban đầu mất 1 byte còn lại mất nhiều hơn. Mã hóa độ dài không biến duy nhất là UTF-32, mất 4 byte cho một điểm mã. Không thường xuyên được sử dụng vì nó khá lãng phí. Có những cái khác, như UTF-1 và UTF-7, bị bỏ qua rộng rãi.

Một vấn đề với mã hóa UTF-16/32 là thứ tự của các byte sẽ phụ thuộc vào tính chất cuối của máy tạo ra luồng văn bản. Vì vậy, thêm vào hỗn hợp UTF-16BE, UTF-16LE, UTF-32BE và UTF-32LE.

Việc có các lựa chọn mã hóa khác nhau này sẽ mang lại thảm họa trang mã ở một mức độ nào đó, cùng với các cuộc tranh luận sôi nổi giữa các lập trình viên mà lựa chọn UTF là "tốt nhất". Sự liên kết của họ với hệ điều hành mặc định khá nhiều vẽ các đường. Một biện pháp đối lập là định nghĩa của BOM, Dấu thứ tự Byte, một mật mã đặc biệt (U + FEFF, không gian chiều rộng bằng không) ở đầu luồng văn bản cho biết phần còn lại của luồng được mã hóa. Nó chỉ ra cả mã hóa UTF và endianess và trung tính với công cụ kết xuất văn bản. Thật không may, nó là tùy chọn và nhiều lập trình viên tuyên bố quyền bỏ qua nó vì vậy tai nạn vẫn còn khá phổ biến.


31

java cung cấp hỗ trợ cho Unicode tức là nó hỗ trợ tất cả các bảng chữ cái trên toàn thế giới. Do đó kích thước của char trong java là 2 byte. Và phạm vi là 0 đến 65535.

nhập mô tả hình ảnh ở đây


Keypicture để explain..Nice
Ponmari Subramanian

2
Quá tệ đó là sai. "Mã ASCII (128)" sẽ chính xác.
Đánh dấu Tolonen

15

ASCII có 128 vị trí mã, được phân bổ cho các ký tự đồ họa và ký tự điều khiển (mã điều khiển).

Unicode có 1.114.112 vị trí mã. Khoảng 100.000 trong số chúng hiện đang được phân bổ cho các ký tự và nhiều điểm mã đã được tạo thành các ký tự không cố định (nghĩa là không được sử dụng để mã hóa bất kỳ ký tự nào) và hầu hết các điểm mã chưa được gán.

Những điều duy nhất mà ASCII và Unicode có điểm chung là: 1) Họ là những mã ký tự. 2) 128 vị trí mã đầu tiên của Unicode đã được xác định có cùng ý nghĩa như trong ASCII, ngoại trừ vị trí mã của các ký tự điều khiển ASCII chỉ được định nghĩa là ký hiệu điều khiển, với các tên tương ứng với tên ASCII của chúng, nhưng ý nghĩa của chúng là không được định nghĩa bằng Unicode.

Tuy nhiên, đôi khi, Unicode được đặc trưng (ngay cả trong tiêu chuẩn Unicode!) Là ASCII rộng rãi. Đây là một khẩu hiệu chủ yếu cố gắng truyền đạt ý tưởng rằng Unicode có nghĩa là một mã ký tự phổ quát giống như ASCII trước đây (mặc dù các tiết mục ký tự của ASCII là không đủ để sử dụng phổ biến), ngược lại với việc sử dụng các mã khác nhau trong hệ thống và ứng dụng khác nhau và cho các ngôn ngữ khác nhau.

Unicode như vậy chỉ định nghĩa kích thước lôgic của người dùng: Các ký tự: Mỗi ký tự có một số mã trong một phạm vi cụ thể. Các số mã này có thể được trình bày bằng cách sử dụng các mã hóa truyền khác nhau và trong nội bộ, trong bộ nhớ, các ký tự Unicode thường được biểu diễn bằng một hoặc hai đại lượng 16 bit cho mỗi ký tự, tùy thuộc vào phạm vi ký tự, đôi khi sử dụng một đại lượng 32 bit cho mỗi ký tự.


2
Tôi nghĩ rằng mã hóa phổ biến nhất cho Unicode là UTF-8 ngày nay. UTF-8 mã hóa hầu hết các điểm mã trong 1, 2 hoặc 3 byte.
Binarus

14

ASCII và Unicode là hai bảng mã ký tự. Về cơ bản, chúng là các tiêu chuẩn về cách thể hiện các ký tự khác nhau trong nhị phân để chúng có thể được viết, lưu trữ, truyền và đọc trên phương tiện kỹ thuật số. Sự khác biệt chính giữa hai là ở cách chúng mã hóa ký tự và số bit mà chúng sử dụng cho mỗi. ASCII ban đầu sử dụng bảy bit để mã hóa từng ký tự. Điều này sau đó đã được tăng lên thành tám với ASCII mở rộng để giải quyết sự bất cập rõ ràng của bản gốc. Ngược lại, Unicode sử dụng chương trình mã hóa bit biến đổi trong đó bạn có thể chọn giữa mã hóa 32, 16 và 8 bit. Sử dụng nhiều bit hơn cho phép bạn sử dụng nhiều ký tự hơn với chi phí cho các tệp lớn hơn trong khi ít bit hơn cho bạn lựa chọn hạn chế nhưng bạn tiết kiệm được nhiều không gian. Sử dụng ít bit hơn (nghĩa là

Một trong những lý do chính tại sao Unicode là vấn đề nảy sinh từ nhiều chương trình ASCII mở rộng không chuẩn. Trừ khi bạn đang sử dụng trang phổ biến, được sử dụng bởi Microsoft và hầu hết các công ty phần mềm khác, thì bạn có thể gặp phải sự cố với các ký tự của bạn xuất hiện dưới dạng hộp. Unicode hầu như loại bỏ vấn đề này vì tất cả các điểm mã ký tự đã được chuẩn hóa.

Một ưu điểm lớn khác của Unicode là ở mức tối đa, nó có thể chứa một số lượng lớn các ký tự. Do đó, Unicode hiện chứa hầu hết các ngôn ngữ viết và vẫn còn nhiều chỗ hơn. Điều này bao gồm các tập lệnh từ trái sang phải điển hình như tiếng Anh và thậm chí các tập lệnh từ phải sang trái như tiếng Ả Rập. Tiếng Trung, tiếng Nhật và nhiều biến thể khác cũng được thể hiện trong Unicode. Vì vậy, Unicode sẽ không được thay thế bất cứ lúc nào sớm.

Để duy trì khả năng tương thích với ASCII cũ hơn, vốn đã được sử dụng rộng rãi vào thời điểm đó, Unicode được thiết kế theo cách mà tám bit đầu tiên khớp với trang ASCII phổ biến nhất. Vì vậy, nếu bạn mở tệp được mã hóa ASCII bằng Unicode, bạn vẫn nhận được các ký tự được mã hóa chính xác trong tệp. Điều này tạo thuận lợi cho việc áp dụng Unicode vì nó giảm bớt tác động của việc áp dụng một tiêu chuẩn mã hóa mới cho những người đã sử dụng ASCII.

Tóm lược:

1.ASCII uses an 8-bit encoding while Unicode uses a variable bit encoding.
2.Unicode is standardized while ASCII isn’t.
3.Unicode represents most written languages in the world while ASCII does not.
4.ASCII has its equivalent within Unicode.

Lấy từ: http : //www.differenceb between.net/t Technology / software-t Technology / distference-b between-unicode-and-fascii / # ixzz4zEjnxPhs



0

ASCII định nghĩa 128 ký tự, vì Unicode chứa một tiết mục gồm hơn 120.000 ký tự.


4
-1 cho "Trả lời" trùng lặp tầm thường này không thêm gì vào các Câu trả lời trước đó. Vui lòng không thêm sự lộn xộn trùng lặp như thế này (nhận đại diện theo những cách khác hợp pháp).
cellepo

-1

Ngoài cách UTF là siêu bộ của ASCII, một điểm khác biệt nữa cần biết giữa ASCII và UTF là về mã hóa tệp đĩa và biểu diễn và lưu trữ dữ liệu trong bộ nhớ ngẫu nhiên. Các chương trình biết rằng dữ liệu đã cho nên được hiểu là chuỗi ASCII hoặc UTF bằng cách phát hiện mã đánh dấu thứ tự byte đặc biệt khi bắt đầu dữ liệu hoặc bằng cách giả sử từ ý định của lập trình viên rằng dữ liệu là văn bản và sau đó kiểm tra xem nó có phải là mẫu không trong một mã hóa văn bản hoặc khác.

Sử dụng ký hiệu tiền tố thông thường của 0xdữ liệu thập lục phân, tham chiếu tốt cơ bản là văn bản ASCII bắt đầu bằng các giá trị byte 0x00để 0x7Fbiểu thị một trong các giá trị ký tự ASCII có thể . Văn bản UTF thường được chỉ định bằng cách bắt đầu với các byte 0xEF 0xBB 0xBFcho UTF8. Đối với UTF16, bắt đầu byte0xFE 0xFF hoặc 0xFF 0xFEđược sử dụng, với thứ tự cuối của các byte văn bản được chỉ định bởi thứ tự của byte bắt đầu. Sự hiện diện đơn giản của các giá trị byte không nằm trong phạm vi ASCII của các giá trị byte có thể cũng chỉ ra rằng dữ liệu có thể là UTF.

Có các dấu thứ tự byte khác sử dụng các mã khác nhau để biểu thị dữ liệu nên được hiểu là văn bản được mã hóa trong một tiêu chuẩn mã hóa nhất định.

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.