Unicode, UTF-8, UTF-16 là gì?


395

Cơ sở cho Unicode là gì và tại sao cần UTF-8 hoặc UTF-16? Tôi đã nghiên cứu điều này trên Google và cũng đã tìm kiếm ở đây nhưng nó không rõ ràng với tôi.

Trong VSS khi thực hiện so sánh tệp, đôi khi có một thông báo cho biết hai tệp có UTF khác nhau. Tại sao nó lại là vấn đề?

Hãy giải thích bằng các thuật ngữ đơn giản.


123
Âm thanh như bạn cần phải đọc 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ề bộ ký tự Unicode và ký tự ! Đó là một lời giải thích rất tốt về những gì đang xảy ra.
Brian Agnew

5
Câu hỏi thường gặp này từ trang web Unicode chính thức có một số câu trả lời cho bạn.
Nemanja Trifunovic

4
@ John: đó là một giới thiệu rất hay, nhưng nó không phải là nguồn cuối cùng: Nó bỏ qua khá nhiều chi tiết (rất tốt cho một tổng quan / giới thiệu!)
Joachim Sauer

5
Bài viết rất hay, nhưng nó có một số sai lầm và đại diện cho UTF-8 trong ánh sáng có phần bảo thủ. Tôi đề nghị đọc utf8everywhere.org như một sự bổ sung.
Pavel Radzivilovsky

2
Hãy xem trang web này: utf8everywhere.org
Vertexwahn

Câu trả lời:


550

Tại sao chúng ta cần Unicode?

Trong những ngày đầu (không quá), tất cả những gì tồn tại là ASCII. Điều này không sao, vì tất cả những gì cần thiết là một vài ký tự điều khiển, dấu câu, số và chữ cái giống như trong câu này. Thật không may, thế giới kỳ lạ của truyền thông xã hội và truyền thông xã hội ngày nay không lường trước được và không quá bất thường khi thấy tiếng Anh, tiếng Anh,, עִבְ עִבְעִבְ trình duyệt).

Nhưng để tranh luận, giả sử Joe Average là nhà phát triển phần mềm. Anh ấy khẳng định rằng anh ấy sẽ chỉ cần tiếng Anh, và như vậy chỉ muốn sử dụng ASCII. Điều này có thể tốt cho người dùng Joe , nhưng điều này không tốt cho Joe nhà phát triển phần mềm . Khoảng một nửa thế giới sử dụng các ký tự không phải là tiếng Latinh và sử dụng ASCII được cho là không phù hợp với những người này, và trên hết, anh ta đang đóng cửa phần mềm của mình cho một nền kinh tế lớn và đang phát triển.

Do đó, một bộ ký tự bao gồm tất cả các ngôn ngữ là cần thiết. Do đó, Unicode. Nó gán cho mỗi ký tự một số duy nhất gọi là điểm mã . Một lợi thế của Unicode so với các bộ có thể khác là 256 điểm mã đầu tiên giống hệt với ISO-8859-1 , và do đó cũng là ASCII. Ngoài ra, phần lớn các ký tự thường được sử dụng chỉ có thể biểu thị bằng hai byte, trong một vùng được gọi là Mặt phẳng đa ngôn ngữ cơ bản (BMP) . Bây giờ cần mã hóa ký tự để truy cập bộ ký tự này và như câu hỏi yêu cầu, tôi sẽ tập trung vào UTF-8 và UTF-16.

Cân nhắc bộ nhớ

Vì vậy, có bao nhiêu byte cung cấp quyền truy cập vào các ký tự trong các bảng mã này?

  • UTF-8:
    • 1 byte: ASCII tiêu chuẩn
    • 2 byte: tiếng Ả Rập, tiếng Do Thái, hầu hết các chữ viết châu Âu (đáng chú ý nhất là tiếng Gruzia )
    • 3 byte: BMP
    • 4 byte: Tất cả các ký tự Unicode
  • UTF-16:
    • 2 byte: BMP
    • 4 byte: Tất cả các ký tự Unicode

Điều đáng nói bây giờ là các nhân vật không có trong BMP bao gồm các chữ viết cổ, ký hiệu toán học, ký hiệu âm nhạc và các ký tự Trung Quốc / Nhật Bản / Hàn Quốc (CJK) hiếm hơn .

Nếu bạn sẽ làm việc chủ yếu với các ký tự ASCII, thì UTF-8 chắc chắn sẽ hiệu quả hơn về bộ nhớ. Tuy nhiên, nếu bạn đang làm việc chủ yếu với các tập lệnh phi châu Âu, sử dụng UTF-8 có thể hiệu quả bộ nhớ thấp hơn tới 1,5 lần so với UTF-16. Khi xử lý một lượng lớn văn bản, chẳng hạn như các trang web lớn hoặc các tài liệu từ dài, điều này có thể ảnh hưởng đến hiệu suất.

Mã hóa cơ bản

Lưu ý: Nếu bạn biết UTF-8 và UTF-16 được mã hóa như thế nào, hãy bỏ qua phần tiếp theo cho các ứng dụng thực tế.

  • UTF-8: Đối với các ký tự ASCII (0-127) tiêu chuẩn, mã UTF-8 giống hệt nhau. Điều này làm cho UTF-8 trở nên lý tưởng nếu cần có khả năng tương thích ngược với văn bản ASCII hiện có. Các ký tự khác yêu cầu bất cứ nơi nào từ 2-4 byte. Điều này được thực hiện bằng cách dự trữ một số bit trong mỗi byte này để chỉ ra rằng nó là một phần của ký tự nhiều byte. Cụ thể, bit đầu tiên của mỗi byte là 1để tránh xung đột với các ký tự ASCII.
  • UTF-16: Đối với các ký tự BMP hợp lệ, đại diện UTF-16 chỉ đơn giản là điểm mã của nó. Tuy nhiên, đối với các ký tự không phải BMP, UTF-16 giới thiệu các cặp thay thế . Trong trường hợp này, sự kết hợp của hai phần ánh xạ hai byte thành một ký tự không phải BMP. Các phần hai byte này đến từ phạm vi số BMP, nhưng được đảm bảo theo tiêu chuẩn Unicode là không hợp lệ dưới dạng ký tự BMP. Ngoài ra, vì UTF-16 có hai byte là đơn vị cơ bản của nó, nên nó bị ảnh hưởng bởi tuổi thọ . Để bù lại, một dấu thứ tự byte dành riêng có thể được đặt ở đầu luồng dữ liệu cho biết độ bền. Do đó, nếu bạn đang đọc đầu vào UTF-16 và không có chỉ định về tuổi thọ, bạn phải kiểm tra điều này.

Có thể thấy, UTF-8 và UTF-16 không tương thích với nhau. Vì vậy, nếu bạn đang thực hiện I / O, hãy chắc chắn rằng bạn biết bạn đang sử dụng mã hóa nào! Để biết thêm chi tiết về các bảng mã này, vui lòng xem Câu hỏi thường gặp về UTF .

Cân nhắc lập trình thực tế

Các kiểu dữ liệu ký tự và chuỗi: Chúng được mã hóa bằng ngôn ngữ lập trình như thế nào? Nếu chúng là byte thô, phút mà bạn cố gắng xuất các ký tự không phải ASCII, bạn có thể gặp phải một số vấn đề. Ngoài ra, ngay cả khi loại ký tự dựa trên UTF, điều đó không có nghĩa là các chuỗi là UTF phù hợp. Họ có thể cho phép các chuỗi byte là bất hợp pháp. Nói chung, bạn sẽ phải sử dụng thư viện hỗ trợ UTF, chẳng hạn như ICU cho C, C ++ và Java. Trong mọi trường hợp, nếu bạn muốn nhập / xuất một cái gì đó ngoài mã hóa mặc định, bạn sẽ phải chuyển đổi nó trước.

Mã hóa được đề xuất / mặc định / chiếm ưu thế: Khi được lựa chọn sử dụng UTF nào, tốt nhất là tuân theo các tiêu chuẩn được đề xuất cho môi trường bạn đang làm việc. Ví dụ: UTF-8 chiếm ưu thế trên web và kể từ HTML5, nó đã được mã hóa đề nghị . Ngược lại, cả môi trường .NET và Java đều được thiết lập trên loại ký tự UTF-16. Một cách khó hiểu (và không chính xác), các tham chiếu thường được thực hiện cho "mã hóa Unicode", thường đề cập đến mã hóa UTF chi phối trong một môi trường nhất định.

Hỗ trợ thư viện: Các thư viện bạn đang sử dụng hỗ trợ một số loại mã hóa. Cái nào? Họ có hỗ trợ các trường hợp góc? Vì sự cần thiết là mẹ của sáng chế, các thư viện UTF-8 thường sẽ hỗ trợ đúng các ký tự 4 byte, vì các ký tự 1, 2 và thậm chí 3 byte có thể xảy ra thường xuyên. Tuy nhiên, không phải tất cả các thư viện UTF-16 có mục đích đều hỗ trợ các cặp thay thế đúng vì chúng rất hiếm khi xảy ra.

Đếm các ký tự: Có tồn tại kết hợp các ký tự trong Unicode. Ví dụ: điểm mã U + 006E (n) và U + 0303 (dấu ngã kết hợp) tạo thành ñ, nhưng điểm mã U + 00F1 tạo thành ñ. Chúng trông giống hệt nhau, nhưng một thuật toán đếm đơn giản sẽ trả về 2 cho ví dụ đầu tiên, 1 cho cái sau. Điều này không hẳn là sai, nhưng cũng có thể không phải là kết quả mong muốn.

So sánh về sự bình đẳng: A, Ny và Α trông giống nhau, nhưng chúng lần lượt là tiếng Latin, Cyrillic và Hy Lạp. Bạn cũng có những trường hợp như C và, một là chữ cái, cái còn lại là chữ số La Mã. Ngoài ra, chúng tôi có các nhân vật kết hợp để xem xét là tốt. Để biết thêm thông tin, xem các ký tự trùng lặp trong Unicode .

Các cặp thay thế: Chúng xuất hiện thường xuyên đủ trên SO, vì vậy tôi sẽ chỉ cung cấp một số liên kết ví dụ:

Khác?:


11
Câu trả lời tuyệt vời, cơ hội tuyệt vời cho tiền thưởng ;-) Cá nhân tôi muốn thêm rằng một số người tranh luận về UTF-8 là mã hóa ký tự phổ quát , nhưng tôi biết rằng đó là một ý kiến ​​không nhất thiết phải được mọi người chia sẻ.
Joachim Sauer

3
Vẫn còn quá kỹ thuật cho tôi ở giai đoạn này. Từ hello được lưu trữ trong máy tính trong UTF-8 và UTF-16 như thế nào?
FirstName LastName

1
Bạn có thể mở rộng thêm về lý do tại sao, ví dụ, BMP mất 3 byte trong UTF-8 không? Tôi đã nghĩ rằng vì giá trị tối đa của nó là 0xFFFF (16 bit) nên sẽ chỉ mất 2 byte để truy cập.
đánh dấu

2
@mark Một số bit được dành riêng cho mục đích mã hóa. Đối với một điểm mã mất 2 byte trong UTF-8, có 5 bit dành riêng, chỉ còn lại 11 bit để chọn một điểm mã. U + 07FF kết thúc là điểm mã cao nhất có thể biểu thị bằng 2 byte.
DPenner1

1
BTW - ASCII chỉ xác định 128 điểm mã, chỉ sử dụng 7 bit để biểu diễn. Đó là ISO-8859-1 / ISO-8859-15 xác định 256 điểm mã và sử dụng 8 bit để biểu diễn. 128 điểm mã đầu tiên trong cả 3 điểm này đều giống nhau.
Tuxdude

67
  • Unicode
    • là một tập hợp các ký tự được sử dụng trên toàn thế giới
  • UTF-8
    • mã hóa ký tự có khả năng mã hóa tất cả các ký tự có thể (được gọi là điểm mã) bằng Unicode.
    • đơn vị mã là 8 bit
    • sử dụng một đến bốn đơn vị mã để mã hóa Unicode
    • 00100100 cho " $ " (một 8 bit); 11000010 10100010 cho " ¢ " (hai 8-bit); 11100010 10000010 10101100 cho " " (ba 8 bit)
  • UTF-16
    • mã hóa ký tự khác
    • đơn vị mã là 16 bit
    • sử dụng một đến hai đơn vị mã để mã hóa Unicode
    • 00000000 00100100 cho " $ " (một 16 bit); 11011000 01010010 11011111 01100010 cho " 𤭢 " (hai 16-bit)

1
Ngắn gọn và chính xác
Aritra Chatterjee

30

Unicode là một tiêu chuẩn khá phức tạp. Đừng quá sợ hãi, nhưng hãy chuẩn bị cho một số công việc! [2]

Bởi vì một nguồn tài nguyên đáng tin cậy luôn luôn cần thiết, nhưng báo cáo chính thức là rất lớn, tôi khuyên bạn nên đọc như sau:

  1. 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ề bộ ký tự Unicode và ký tự (Không có lý do!) Giới thiệu của Joel Spolsky, Giám đốc điều hành Stack Exchange.
  2. Đến BMP và hơn thế nữa! Hướng dẫn của Eric Muller, Giám đốc kỹ thuật sau đó, Phó chủ tịch sau đó, tại Hiệp hội Unicode. (20 slide đầu tiên và bạn đã hoàn thành)

Một lời giải thích ngắn gọn:

Máy tính đọc byte và mọi người đọc ký tự, vì vậy chúng tôi sử dụng các tiêu chuẩn mã hóa để ánh xạ các ký tự thành byte. ASCII là tiêu chuẩn được sử dụng rộng rãi đầu tiên, nhưng chỉ bao gồm tiếng Latin (7 bit / ký tự có thể đại diện cho 128 ký tự khác nhau). Unicode là một tiêu chuẩn với mục tiêu bao gồm tất cả các ký tự có thể có trên thế giới (có thể chứa tối đa 1.114.112 ký tự, nghĩa là tối đa 21 bit / ký tự. Unicode 8.0 hiện tại chỉ định tổng cộng 120.737 ký tự và đó là tất cả).

Sự khác biệt chính là một ký tự ASCII có thể vừa với một byte (8 bit), nhưng hầu hết các ký tự Unicode không thể. Vì vậy, các biểu mẫu / sơ đồ mã hóa (như UTF-8 và UTF-16) được sử dụng và mô hình ký tự diễn ra như sau:

Mỗi ký tự giữ một vị trí liệt kê từ 0 đến 1.114.111 (hex: 0-10FFFF) được gọi là điểm mã .
Một hình thức mã hóa ánh xạ một điểm mã đến một chuỗi đơn vị mã. Một đơn vị mã là theo cách bạn muốn nhân vật sẽ được tổ chức trong bộ nhớ, đơn vị 8-bit, đơn vị 16-bit và vân vân. UTF-8 sử dụng 1 đến 4 đơn vị 8 bit và UTF-16 sử dụng 1 hoặc 2 đơn vị 16 bit, để bao phủ toàn bộ Unicode tối đa 21 bit. Các đơn vị sử dụng tiền tố để có thể phát hiện ranh giới ký tự và nhiều đơn vị hơn có nghĩa là nhiều tiền tố chiếm bit. Vì vậy, mặc dù UTF-8 sử dụng 1 byte cho tập lệnh Latin nhưng nó cần 3 byte cho các tập lệnh sau trong Mặt phẳng đa ngôn ngữ cơ bản, trong khi UTF-16 sử dụng 2 byte cho tất cả các tập lệnh này. Và đó là sự khác biệt chính của họ.
Cuối cùng, một sơ đồ mã hóa (như UTF-16BE hoặc UTF-16LE) ánh xạ (tuần tự hóa) một chuỗi đơn vị mã thành một chuỗi byte.

ký tự:
điểm mã π :
dạng mã hóa U + 03C0 (đơn vị mã):
      UTF-8: CF 80
      UTF-16: 03C0
lược đồ mã hóa (byte):
      UTF-8: CF 80
      UTF-16BE: 03 C0
      UTF-16LE: C0 03

Mẹo: một chữ số hex biểu thị 4 bit, do đó, số hex hai chữ số biểu thị cho một byte
Cũng hãy xem Bản đồ máy bay trong Wikipedia để có cảm giác về bố cục bộ ký tự


19

Ban đầu, Unicode được dự định có mã hóa 16 bit có chiều rộng cố định (UCS-2). Những người đầu tiên sử dụng Unicode, như Java và Windows NT, đã xây dựng các thư viện của họ xung quanh các chuỗi 16 bit.

Sau đó, phạm vi của Unicode đã được mở rộng để bao gồm các ký tự lịch sử, sẽ yêu cầu nhiều hơn 65.536 điểm mã mà mã hóa 16 bit sẽ hỗ trợ. Để cho phép các ký tự bổ sung được thể hiện trên các nền tảng đã sử dụng UCS-2, mã hóa UTF-16 đã được giới thiệu. Nó sử dụng "cặp thay thế" để thể hiện các ký tự trong các mặt phẳng bổ sung.

Trong khi đó, rất nhiều phần mềm và giao thức mạng cũ hơn đang sử dụng chuỗi 8 bit. UTF-8 đã được tạo ra để các hệ thống này có thể hỗ trợ Unicode mà không phải sử dụng các ký tự rộng. Nó tương thích ngược với ASCII 7 bit.


3
Điều đáng chú ý là Microsoft vẫn gọi UTF-16 là Unicode, làm tăng thêm sự nhầm lẫn. Hai cái không giống nhau.
Đánh dấu tiền chuộc

15

Bài viết này giải thích tất cả các chi tiết http://kunststube.net/encoding/

VIẾT ĐỂ BUFFER

nếu bạn ghi vào bộ đệm 4 byte, ký hiệu có mã hóa UTF8, tệp nhị phân của bạn sẽ trông như thế này:

00000000 11100011 10000001 10000010

nếu bạn ghi vào bộ đệm 4 byte, ký hiệu có mã hóa UTF16, tệp nhị phân của bạn sẽ trông như thế này:

00000000 00000000 00110000 01000010

Như bạn có thể thấy, tùy thuộc vào ngôn ngữ bạn sẽ sử dụng trong nội dung của mình, điều này sẽ ảnh hưởng đến bộ nhớ của bạn.

ví dụ: Đối với biểu tượng cụ thể này: mã hóa UTF16 hiệu quả hơn vì chúng tôi có 2 byte dự phòng để sử dụng cho biểu tượng tiếp theo. Nhưng điều đó không có nghĩa là bạn phải sử dụng bảng chữ cái UTF16 cho Nhật Bản.

ĐỌC TỪ BUFFER

Bây giờ nếu bạn muốn đọc các byte ở trên, bạn phải biết nó được viết mã hóa và giải mã lại chính xác.

ví dụ: Nếu bạn giải mã điều này: 00000000 11100011 10000001 10000010 thành mã hóa UTF16, bạn sẽ không

Lưu ý: Mã hóa và Unicode là hai thứ khác nhau. Unicode là bảng (bảng) lớn với mỗi ký hiệu được ánh xạ tới một điểm mã duy nhất. ví dụ: ký hiệu (chữ cái) có (điểm mã) : 30 42 (hex). Mặt khác, mã hóa là một thuật toán chuyển đổi các ký hiệu thành cách thích hợp hơn, khi lưu trữ vào phần cứng.

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.

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


11

Unicode là một tiêu chuẩn ánh xạ các ký tự trong tất cả các ngôn ngữ thành một giá trị số cụ thể được gọi là Điểm Mã . Lý do nó làm điều này là vì nó cho phép các mã hóa khác nhau có thể sử dụng cùng một tập hợp các điểm mã.

UTF-8 và UTF-16 là hai bảng mã như vậy. Họ lấy các điểm mã làm đầu vào và mã hóa chúng bằng cách sử dụng một số công thức được xác định rõ để tạo ra chuỗi được mã hóa.

Chọn một mã hóa cụ thể phụ thuộc vào yêu cầu của bạn. Các mã hóa khác nhau có các yêu cầu bộ nhớ khác nhau và tùy thuộc vào các ký tự mà bạn sẽ xử lý, bạn nên chọn mã hóa sử dụng các chuỗi byte ít nhất để mã hóa các ký tự đó.

Để biết thêm chi tiết chuyên sâu về Unicode, UTF-8 và UTF-16, bạn có thể xem bài viết này,

Những gì mọi lập trình viên nên biết về Unicode


9

Tại sao unicode? Bởi vì ASCII chỉ có 127 ký tự. Những người từ 128 đến 255 khác nhau ở các quốc gia khác nhau, đó là lý do tại sao có các loại tiền mã hóa. Vì vậy, họ nói cho phép có tối đa 111411 ký tự. Vậy làm thế nào để bạn lưu trữ mật mã cao nhất? Bạn sẽ cần lưu trữ nó bằng 21 bit, vì vậy bạn sẽ sử dụng DWORD có 32 bit bị lãng phí 11 bit. Vì vậy, nếu bạn sử dụng DWORD để lưu trữ một ký tự unicode, đó là cách dễ nhất vì giá trị trong DWORD của bạn khớp chính xác với điểm mã. Nhưng mảng DWORD tất nhiên lớn hơn mảng WORD và tất nhiên thậm chí còn lớn hơn mảng BYTE. Đó là lý do tại sao không chỉ có utf-32, mà còn có utf-16. Nhưng utf-16 có nghĩa là một luồng WORD và một WORD có 16 bit, vậy làm thế nào để mã hóa cao nhất 1114111 có thể phù hợp với một WORD? Nó không thể! Vì vậy, họ đặt mọi thứ cao hơn 65535 vào DWORD mà họ gọi là cặp thay thế. Cặp thay thế như vậy là hai TỪ KHÓA và có thể được phát hiện bằng cách nhìn vào 6 bit đầu tiên. Vậy còn utf-8 thì sao? Nó là một mảng byte hoặc luồng byte, nhưng làm thế nào mã hóa cao nhất 1114111 có thể phù hợp với một byte? Nó không thể! Được rồi, vì vậy họ cũng đặt một DWORD phải không? Hoặc có thể là một WORD, phải không? Gần như đúng! Họ đã phát minh ra các chuỗi utf-8, có nghĩa là mọi mã hóa cao hơn 127 phải được mã hóa thành chuỗi 2 byte, 3 byte hoặc 4 byte. Ồ Nhưng làm thế nào chúng ta có thể phát hiện các chuỗi như vậy? Chà, mọi thứ lên tới 127 là ASCII và là một byte đơn. Những gì bắt đầu với 110 là một chuỗi hai byte, những gì bắt đầu với 1110 là một chuỗi ba byte và những gì bắt đầu với 11110 là một chuỗi bốn byte. Các bit còn lại của cái gọi là "startbyte" này thuộc về điểm mã. Bây giờ tùy thuộc vào chuỗi, các byte sau phải tuân theo. Một byte sau bắt đầu bằng 10, các bit còn lại là 6 bit của bit tải trọng và thuộc về điểm mã. Ghép các bit tải trọng của startbyte và byte / s sau đây và bạn sẽ có mật mã. Đó là tất cả sự kỳ diệu của utf-8.


3
Ví dụ utf-8 của ký hiệu € (Euro) được giải mã theo chuỗi utf-8 3 byte: E2 = 11100010 82 = 10000010 AC = 10101100 Như bạn có thể thấy, E2 bắt đầu bằng 1110 vì vậy đây là chuỗi ba byte Như bạn có thể thấy , 82 cũng như AC bắt đầu bằng 10 vì vậy đây là các byte theo sau Bây giờ chúng tôi ghép các "bit tải trọng": 0010 + 000010 + 101100 = 10000010101100 là số thập phân 8364 Vì vậy, 8364 phải là mã số cho ký hiệu € (Euro).
sáng

5

ASCII - Phần mềm chỉ phân bổ byte 8 bit trong bộ nhớ cho một ký tự cho trước. Nó hoạt động tốt cho các ký tự tiếng Anh và được thông qua (loanwords như façade) vì các giá trị thập phân tương ứng của chúng giảm xuống dưới 128 trong giá trị thập phân. Ví dụ chương trình C.

UTF-8 - Phần mềm phân bổ 1 đến 4 byte 8 bit biến cho một ký tự cho trước. Có nghĩa là gì bởi biến ở đây? Giả sử bạn đang gửi ký tự 'A' qua các trang HTML của mình trong trình duyệt (HTML là UTF-8), giá trị thập phân tương ứng của A là 65, khi bạn chuyển đổi thành số thập phân, nó trở thành 01000010. Điều này chỉ cần 1 byte , Bộ nhớ 1 byte được phân bổ ngay cả đối với các ký tự tiếng Anh được chấp nhận đặc biệt như 'ç' trong một mặt tiền từ. Tuy nhiên, khi bạn muốn lưu trữ các ký tự châu Âu, nó cần 2 byte, vì vậy bạn cần UTF-8. Tuy nhiên, khi bạn chọn các ký tự châu Á, bạn yêu cầu tối thiểu 2 byte và tối đa 4 byte. Tương tự, Emoji yêu cầu 3 đến 4 byte. UTF-8 sẽ giải quyết tất cả các nhu cầu của bạn.

UTF-16 sẽ phân bổ tối thiểu 2 byte và tối đa 4 byte cho mỗi ký tự, nó sẽ không phân bổ 1 hoặc 3 byte. Mỗi ký tự được thể hiện bằng 16 bit hoặc 32 bit.

Vậy thì tại sao lại tồn tại UTF-16? Ban đầu, Unicode là 16 bit chứ không phải 8 bit. Java đã thông qua phiên bản gốc của UTF-16.

Tóm lại, bạn không cần UTF-16 ở bất cứ đâu trừ khi nó đã được ngôn ngữ hoặc nền tảng bạn đang làm việc chấp nhận.

Chương trình Java được gọi bởi trình duyệt web sử dụng UTF-16 nhưng trình duyệt web sẽ gửi các ký tự bằng UTF-8.


"Bạn không cần UTF-16 ở bất cứ đâu trừ khi ngôn ngữ hoặc nền tảng đã được chấp nhận": Đây là một điểm tốt nhưng đây là danh sách không bao gồm: JavaScript, Java, .NET, SQL NCHAR, SQL NVARCHAR , VB4, VB5, VB6, VBA, VBScript, NTFS, Windows API.
Tom Blodget

2

UTF là viết tắt của cụm từ Định dạng Chuyển đổi Unicode. Về cơ bản trong thế giới ngày nay, có các tập lệnh được viết bằng hàng trăm ngôn ngữ khác, các định dạng không được trình bày bởi ASCII cơ bản được sử dụng trước đó. Do đó, UTF ra đời.

UTF-8 có khả năng mã hóa ký tự và đơn vị mã của nó là 8 bit trong khi đối với UTF-16 là 16 bit.

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.