UTF-8, UTF-16 và UTF-32


487

Sự khác biệt giữa UTF-8, UTF-16 và UTF-32 là gì?

Tôi hiểu rằng tất cả chúng sẽ lưu trữ Unicode và mỗi loại sử dụng một số byte khác nhau để thể hiện một ký tự. Có một lợi thế để chọn cái này hơn cái kia không?


36
Xem video này nếu bạn quan tâm đến cách Unicode hoạt động youtube.com/watch?v=MijmeoH9LT4

1
Video tập trung vào UTF-8, và vâng, nó giải thích tốt cách mã hóa độ dài biến đổi hoạt động và hầu như tương thích với các máy tính chỉ đọc hoặc viết ASCII có độ dài cố định. Những người Unicode rất thông minh khi thiết kế mã hóa UTF-8.
phút

1
Tôi đã tạo một công cụ trực tuyến để chuyển đổi và so sánh.
Amit Kumar Gupta

1
UTF-8 là tiêu chuẩn thực tế trong hầu hết các phần mềm hiện đại cho các tệp đã lưu . Cụ thể hơn, đó là mã hóa được sử dụng rộng rãi nhất cho HTML và các tệp cấu hình và dịch (ví dụ: Minecraft không chấp nhận bất kỳ mã hóa nào khác cho tất cả thông tin văn bản của nó). UTF-32 rất nhanh để thể hiện bộ nhớ trong và UTF-16 không được dùng nữa , hiện chỉ được sử dụng trong Win32 vì lý do lịch sử ( UTF-16 có độ dài cố định khi Windows 95 là một thứ)
Kotauskas

@VladislavToncharov UTF-16 không bao giờ là mã hóa có độ dài cố định. Bạn đang nhầm lẫn nó với UCS-2.

Câu trả lời:


373

UTF-8 có lợi thế trong trường hợp các ký tự ASCII đại diện cho phần lớn các ký tự trong một khối văn bản, vì UTF-8 mã hóa chúng thành 8 bit (như ASCII). Một điều thuận lợi nữa là tệp UTF-8 chỉ chứa các ký tự ASCII có cùng mã hóa với tệp ASCII.

UTF-16 tốt hơn khi ASCII không chiếm ưu thế, vì chủ yếu sử dụng 2 byte cho mỗi ký tự. UTF-8 sẽ bắt đầu sử dụng 3 byte trở lên cho các ký tự bậc cao hơn trong đó UTF-16 chỉ còn 2 byte cho hầu hết các ký tự.

UTF-32 sẽ bao gồm tất cả các ký tự có thể trong 4 byte. Điều này làm cho nó khá bồng bềnh. Tôi không thể nghĩ ra bất kỳ lợi thế nào khi sử dụng nó.


165
Ưu điểm của UTF-32: bạn không cần giải mã dữ liệu được lưu trữ thành điểm mã Unicode 32 bit, ví dụ như xử lý ký tự. Điểm mã đã có sẵn ngay trong mảng / vector / chuỗi của bạn.
richq

22
Việc phân tích cú pháp cũng dễ dàng hơn nếu (trời giúp bạn) bạn phải thực hiện lại bánh xe.
Paul McMillan

24
Chà, UTF-8 có lợi thế trong việc chuyển mạng - không cần phải lo lắng về tính thời sự vì bạn đang truyền dữ liệu một byte mỗi lần (trái ngược với 4).
Tim Čas

30
@richq Bạn không thể xử lý từng ký tự trong UTF-32, vì điểm mã không phải lúc nào cũng tương ứng với một ký tự.
hamstergene

4
Ưu điểm của UTF-32: thao tác chuỗi có thể nhanh hơn so với tương đương utf-8
Wes

332

Nói ngắn gọn:

  • UTF-8: Mã hóa chiều rộng thay đổi, tương thích ngược với ASCII. Các ký tự ASCII (U + 0000 đến U + 007F) mất 1 byte, các điểm mã U + 0080 đến U + 07FF lấy 2 byte, các điểm mã U + 0800 đến U + FFFF lấy 3 byte, mã điểm U + 10000 thành U + 10FFFF lấy 4 byte. Tốt cho văn bản tiếng Anh, không tốt cho văn bản châu Á.
  • UTF-16: Mã hóa chiều rộng thay đổi. Điểm mã U + 0000 đến U + FFFF lấy 2 byte, điểm mã U + 10000 đến U + 10FFFF lấy 4 byte. Xấu cho văn bản tiếng Anh, tốt cho văn bản châu Á.
  • UTF-32: Mã hóa chiều rộng cố định. Tất cả các điểm mã mất bốn byte. Một bộ nhớ hog khổng lồ, nhưng nhanh chóng để hoạt động. Hiếm khi sử dụng.

Về lâu dài: xem Wikipedia: UTF-8 , UTF-16UTF-32 .


65
@spurrymoses: Tôi đang đề cập nghiêm túc đến dung lượng được chiếm bởi các byte dữ liệu. UTF-8 yêu cầu 3 byte cho mỗi ký tự châu Á, trong khi UTF-16 chỉ yêu cầu 2 byte cho mỗi ký tự châu Á. Đây thực sự không phải là một vấn đề lớn, vì máy tính có hàng tấn bộ nhớ ngày nay so với lượng văn bản trung bình được lưu trữ trong bộ nhớ của chương trình.
Adam Rosenfield

12
UTF-32 không hiếm khi được sử dụng nữa ... trên osx và linux wchar_tmặc định là 4 byte. gcc có một tùy chọn -fshort-wcharlàm giảm kích thước xuống 2 byte, nhưng phá vỡ tính tương thích nhị phân với lib std.
vine'th

9
@PandaWood ofcource UTF-8 có thể mã hóa bất kỳ ký tự nào! Nhưng bạn đã so sánh yêu cầu bộ nhớ với điều đó cho UTF-16 chưa? Bạn dường như đang thiếu điểm!
Ustaman Sangat

16
Nếu ai đó đã nói UTF-8 là "không tốt cho văn bản châu Á" trong bối cảnh của tất cả các định dạng mã hóa bao gồm cả những định dạng không thể mã hóa Unicode, tất nhiên họ sẽ sai. Nhưng đó không phải là bối cảnh. Bối cảnh của các yêu cầu bộ nhớ xuất phát từ thực tế là câu hỏi (và câu trả lời) đang so sánh UTF-8, UTF-16 và UTF-32, tất cả sẽ mã hóa văn bản châu Á nhưng sử dụng lượng bộ nhớ / bộ nhớ khác nhau. Theo sau đó, lòng tốt tương đối của họ sẽ hoàn toàn nằm trong bối cảnh yêu cầu bộ nhớ. "Không tốt lắm"! = "Không tốt".
Paul Gregory

5
@McGafter: Vâng tất nhiên là có. Nếu bạn muốn có sự tin cậy, hãy đến thẳng miệng ngựa tại Hiệp hội Unicode . Xem chương 2.5 để biết mô tả về mã hóa UTF- *. Nhưng để có được sự hiểu biết đơn giản, ở mức độ cao về các bảng mã, tôi thấy rằng các bài viết trên Wikipedia là một nguồn dễ tiếp cận hơn nhiều.
Adam Rosenfield

116
  • UTF-8 là biến 1 đến 4 byte.

  • UTF-16 là biến 2 hoặc 4 byte.

  • UTF-32 được cố định 4 byte.

Lưu ý: UTF-8 có thể mất 1 đến 6 byte với quy ước mới nhất: https://lists.gnu.org/archive/html/help-flex/2005-01/msg00030.html


35
UTF8 thực sự là 1 đến 6 byte.
Urkle

6
@Urkle đúng về mặt kỹ thuật vì ánh xạ toàn bộ phạm vi UTF32 / LE / BE bao gồm U-00200000 - U-7FFFFFFF ngay cả khi Unicode v6.3 kết thúc tại U-0010FFFF. Đây là một phân tích thú vị về cách mã hóa / dec 5 và 6 byte utf8 : lists.gnu.org/archive/html/help-flex/2005-01/msg00030.html

4
sao lưu những thứ này với các phần tham khảo có liên quan và nguồn của họ?
n611x007

20
@Urkle Không, UTF-8 không thể là 5 hoặc 6 byte. Điểm mã Unicode được giới hạn ở 21 bit, giới hạn UTF-8 đến 4 byte. (Tất nhiên bạn có thể mở rộng nguyên tắc UTF-8 để mã hóa các số nguyên lớn tùy ý, nhưng nó sẽ không phải là Unicode.) Xem RFC 3629.
rdb

11
Trích dẫn Wikipedia: Vào tháng 11 năm 2003, UTF-8 đã bị hạn chế bởi RFC 3629 để phù hợp với các ràng buộc của mã hóa ký tự UTF-16: cấm rõ ràng các điểm mã tương ứng với các ký tự thay thế cao và thấp đã loại bỏ hơn 3% chuỗi ba byte và kết thúc tại U + 10FFFF đã loại bỏ hơn 48% chuỗi bốn byte và tất cả các chuỗi năm và sáu byte.
Adam Calvet Bohl

79

Unicode định nghĩa một bộ ký tự khổng lồ duy nhất, gán một giá trị số nguyên duy nhất cho mỗi ký hiệu đồ họa (đó là một sự đơn giản hóa lớn và không thực sự đúng, nhưng nó đủ gần cho mục đích của câu hỏi này). UTF-8/16/32 đơn giản là những cách khác nhau để mã hóa điều này.

Tóm lại, UTF-32 sử dụng các giá trị 32 bit cho mỗi ký tự. Điều đó cho phép họ sử dụng mã có chiều rộng cố định cho mỗi ký tự.

UTF-16 theo mặc định sử dụng 16 bit, nhưng điều đó chỉ cung cấp cho bạn 65 nghìn ký tự có thể, không đủ gần cho bộ Unicode đầy đủ. Vì vậy, một số ký tự sử dụng các cặp giá trị 16 bit.

Và UTF-8 theo mặc định sử dụng các giá trị 8 bit, điều đó có nghĩa là 127 giá trị đầu tiên là các ký tự byte đơn có độ rộng cố định (bit quan trọng nhất được sử dụng để biểu thị rằng đây là khởi đầu của chuỗi nhiều byte, để lại 7 bit cho giá trị ký tự thực tế). Tất cả các ký tự khác được mã hóa thành chuỗi có tối đa 4 byte (nếu bộ nhớ phục vụ).

Và điều đó dẫn chúng ta đến những lợi thế. Bất kỳ ký tự ASCII nào cũng tương thích trực tiếp với UTF-8, vì vậy để nâng cấp các ứng dụng cũ, UTF-8 là một lựa chọn phổ biến và rõ ràng. Trong hầu hết các trường hợp, nó cũng sẽ sử dụng ít bộ nhớ nhất. Mặt khác, bạn không thể đảm bảo về độ rộng của ký tự. Nó có thể rộng 1, 2, 3 hoặc 4 ký tự, điều này làm cho việc thao tác chuỗi trở nên khó khăn.

UTF-32 thì ngược lại, nó sử dụng nhiều bộ nhớ nhất (mỗi ký tự rộng 4 byte cố định), nhưng mặt khác, bạn biết rằng mọi ký tự đều có độ dài chính xác này, do đó thao tác chuỗi trở nên đơn giản hơn rất nhiều. Bạn có thể tính số lượng ký tự trong một chuỗi đơn giản từ độ dài tính bằng byte của chuỗi. Bạn không thể làm điều đó với UTF-8.

UTF-16 là một sự thỏa hiệp. Nó cho phép hầu hết các ký tự khớp với giá trị 16 bit có chiều rộng cố định. Vì vậy, miễn là bạn không có biểu tượng Trung Quốc, nốt nhạc hoặc một số người khác, bạn có thể giả sử rằng mỗi ký tự có chiều rộng 16 bit. Nó sử dụng ít bộ nhớ hơn UTF-32. Nhưng đó là trong một số cách "tồi tệ nhất của cả hai thế giới". Nó hầu như luôn sử dụng nhiều bộ nhớ hơn UTF-8, và nó vẫn không tránh được vấn đề làm hỏng UTF-8 (các ký tự có độ dài thay đổi).

Cuối cùng, thật hữu ích khi chỉ đi với những gì nền tảng hỗ trợ. Windows sử dụng UTF-16 trong nội bộ, vì vậy trên Windows, đó là sự lựa chọn rõ ràng.

Linux thay đổi một chút, nhưng họ thường sử dụng UTF-8 cho mọi thứ tuân thủ Unicode.

Vì vậy, câu trả lời ngắn gọn: Tất cả ba mã hóa có thể mã hóa cùng một bộ ký tự, nhưng chúng đại diện cho mỗi ký tự là các chuỗi byte khác nhau.


12
Thật không chính xác khi nói rằng Unicode gán một số nguyên duy nhất cho mỗi biểu tượng đồ họa . Nó gán như vậy cho từng điểm mã, nhưng một số điểm mã là các ký tự điều khiển vô hình và một số ký hiệu đồ họa yêu cầu nhiều điểm mã để thể hiện.
tchrist

15
@tchrist: vâng, nó không chính xác. Vấn đề là để giải thích chính xác Unicode, bạn cần viết hàng ngàn trang. Tôi hy vọng có được khái niệm cơ bản xuyên suốt để giải thích sự khác biệt giữa các bảng mã
jalf

@jalf lol ngay vì vậy về cơ bản để giải thích Unicode, bạn sẽ phải viết Đặc tả Unicode Core
Justin Ohms

@tchrist Cụ thể hơn, bạn có thể xây dựng các biểu tượng Trung Quốc từ các nguyên thủy được cung cấp (nhưng chúng nằm trong cùng một biểu đồ, vì vậy bạn sẽ kết thúc bằng cách sử dụng dung lượng không thực - cả đĩa hoặc RAM - để mã hóa chúng) thay vì sử dụng tích hợp sẵn.
Kotauskas

44

Unicode là một tiêu chuẩn và về UTF-x mà bạn có thể nghĩ là một triển khai kỹ thuật cho một số mục đích thực tế:

  • UTF-8 - " tối ưu hóa kích thước ": phù hợp nhất với dữ liệu dựa trên ký tự Latinh (hoặc ASCII), chỉ mất 1 byte cho mỗi ký tự nhưng kích thước tăng theo sự đa dạng ký hiệu (và trong trường hợp xấu nhất có thể tăng lên đến 6 byte mỗi ký tự)
  • UTF-16 - " số dư ": cần tối thiểu 2 byte cho mỗi ký tự, đủ cho bộ ngôn ngữ chính hiện có với kích thước cố định trên đó để dễ xử lý ký tự (nhưng kích thước vẫn thay đổi và có thể tăng lên tới 4 byte cho mỗi ký tự )
  • UTF-32 - " hiệu suất ": cho phép sử dụng các thuật toán đơn giản là kết quả của các ký tự có kích thước cố định (4 byte) nhưng có nhược điểm về bộ nhớ

«Ngôn ngữ chính» không phải là ngôn ngữ chính ở nhiều nơi trên thế giới ^^
tuxayo

2
UTF-16 thực sự là kích thước được tối ưu hóa cho các ký tự không ASCII. Đối với nó thực sự phụ thuộc vào ngôn ngữ mà nó sẽ được sử dụng.
tuxayo

@tuxayo hoàn toàn đồng ý, đáng chú ý là các bộ nhân vật Hanzi và Kanji cho phần châu Á trên thế giới.
binh

Nên là câu trả lời hàng đầu. Điều này là quá chính xác để được chôn cất ở đây.
Michal tein

28

Tôi đã cố gắng đưa ra một lời giải thích đơn giản trong blogpost của tôi .

UTF-32

yêu cầu 32 bit (4 byte) để mã hóa bất kỳ ký tự nào . Ví dụ: để thể hiện điểm mã ký tự "A" bằng cách sử dụng lược đồ này, bạn sẽ cần phải viết 65 bằng số nhị phân 32 bit:

00000000 00000000 00000000 01000001 (Big Endian)

Nếu bạn xem xét kỹ hơn, bạn sẽ lưu ý rằng bảy bit đúng nhất thực sự là các bit giống nhau khi sử dụng sơ đồ ASCII. Nhưng vì UTF-32 là lược đồ độ rộng cố định , chúng tôi phải đính kèm ba byte bổ sung. Có nghĩa là nếu chúng ta có hai tệp chỉ chứa ký tự "A", một tệp được mã hóa ASCII và tệp còn lại được mã hóa UTF-32, kích thước của chúng sẽ tương ứng là 1 byte và 4 byte.

UTF-16

Nhiều người nghĩ rằng vì UTF-32 sử dụng chiều rộng cố định 32 bit để thể hiện điểm mã, UTF-16 là chiều rộng cố định 16 bit. SAI LẦM!

Trong UTF-16, điểm mã có thể được biểu thị bằng 16 bit, HOẶC 32 bit. Vì vậy, sơ đồ này là hệ thống mã hóa chiều dài thay đổi. Lợi thế so với UTF-32 là gì? Ít nhất là đối với ASCII, kích thước tệp sẽ không gấp 4 lần bản gốc (nhưng vẫn gấp đôi), vì vậy chúng tôi vẫn không tương thích ngược với ASCII.

Vì 7 bit là đủ để biểu thị ký tự "A", giờ đây chúng ta có thể sử dụng 2 byte thay vì 4 như UTF-32. Nó sẽ trông giống như:

00000000 01000001

UTF-8

Bạn đã đoán đúng .. Trong UTF-8, điểm mã có thể được biểu diễn bằng cách sử dụng 32, 16, 24 hoặc 8 bit, và như hệ thống UTF-16, điểm này cũng là hệ thống mã hóa có độ dài thay đổi.

Cuối cùng, chúng ta có thể biểu diễn "A" giống như cách chúng ta biểu diễn nó bằng hệ thống mã hóa ASCII:

01001101

Một ví dụ nhỏ trong đó UTF-16 thực sự tốt hơn UTF-8:

Hãy xem xét chữ cái "" của Trung Quốc - mã hóa UTF-8 của nó là:

11101000 10101010 10011110

Trong khi mã hóa UTF-16 của nó ngắn hơn:

10001010 10011110

Để hiểu cách trình bày và cách giải thích, hãy truy cập bài viết gốc.


19

UTF-8

  • không có khái niệm về thứ tự byte
  • sử dụng từ 1 đến 4 byte cho mỗi ký tự
  • ASCII là một tập hợp con tương thích của mã hóa
  • hoàn toàn tự đồng bộ hóa, ví dụ một byte bị rơi từ bất kỳ đâu trong luồng sẽ bị hỏng tối đa một ký tự
  • khá nhiều ngôn ngữ châu Âu được mã hóa bằng hai byte hoặc ít hơn cho mỗi ký tự

UTF-16

  • phải được phân tích cú pháp theo thứ tự byte đã biết hoặc đọc dấu thứ tự byte (BOM)
  • sử dụng 2 hoặc 4 byte cho mỗi ký tự

UTF-32

  • mỗi ký tự là 4 byte
  • phải được phân tích cú pháp theo thứ tự byte đã biết hoặc đọc dấu thứ tự byte (BOM)

UTF-8 sẽ là không gian hiệu quả nhất trừ khi phần lớn các nhân vật đến từ không gian nhân vật CJK (Trung Quốc, Nhật Bản và Hàn Quốc).

UTF-32 là tốt nhất để truy cập ngẫu nhiên bằng cách bù ký tự vào một mảng byte.


"Tự đồng bộ hóa" hoạt động như thế nào trong UTF-8? Bạn có thể đưa ra ví dụ cho các ký tự 1 byte và 2 byte không?
Koray Tugay

2
@KorayTugay Các chuỗi byte ngắn hơn hợp lệ không bao giờ được sử dụng trong các ký tự dài hơn. Chẳng hạn, ASCII nằm trong phạm vi 0-127, có nghĩa là tất cả các ký tự một byte có dạng 0xxxxxxxnhị phân. Tất cả các ký tự hai byte bắt đầu 110xxxxxbằng một byte thứ hai 10xxxxxx. Vì vậy, giả sử ký tự đầu tiên của ký tự hai byte bị mất. Ngay khi bạn nhìn thấy 10xxxxxxmà không có trước 110xxxxxx, bạn có thể xác định chắc chắn rằng một byte bị mất hoặc bị hỏng và loại bỏ ký tự đó (hoặc yêu cầu lại từ máy chủ hoặc bất cứ điều gì), và tiếp tục cho đến khi bạn gặp lại byte đầu tiên hợp lệ .
Chris

1
nếu bạn có phần bù cho một ký tự, bạn có phần bù cho ký tự đó - utf8, utf16 hoặc utf32 sẽ hoạt động giống nhau trong trường hợp đó; tức là tất cả chúng đều tốt như nhau khi truy cập ngẫu nhiên bằng ký tự bù vào một mảng byte. Ý tưởng rằng utf32 tốt hơn trong việc đếm các ký tự so với utf8 cũng hoàn toàn sai. Một mật ( không giống với ký tự một lần nữa, không giống với biểu đồ .. thở dài), rộng 32 bit trong utf32 và giữa 8 và 32 bit trong utf8, nhưng một ký tự có thể trải rộng trên nhiều điểm mã, phá hủy lợi thế lớn mà mọi người tuyên bố utf32 có trên utf8.
Rõ ràng hơn

14

Tôi đã thực hiện một số thử nghiệm để so sánh hiệu suất cơ sở dữ liệu giữa UTF-8 và UTF-16 trong MySQL.

Cập nhật tốc độ

UTF-8

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

UTF-16

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

Chèn tốc độ

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

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

Xóa tốc độ

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

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


14

Trong UTF-32, tất cả các ký tự được mã hóa bằng 32 bit. Ưu điểm là bạn có thể dễ dàng tính toán độ dài của chuỗi. Nhược điểm là đối với mỗi ký tự ASCII, bạn lãng phí thêm ba byte.

Trong các ký tự UTF-8 có độ dài thay đổi, các ký tự ASCII được mã hóa bằng một byte (tám bit), hầu hết các ký tự đặc biệt phương tây được mã hóa bằng hai byte hoặc ba byte (ví dụ € là ba byte) và các ký tự kỳ lạ hơn có thể chiếm đến bốn byte. Rõ ràng nhược điểm là, một ưu tiên bạn không thể tính được độ dài của chuỗi. Nhưng nó cần ít byte hơn để mã văn bản bảng chữ cái Latinh (tiếng Anh), so với UTF-32.

UTF-16 cũng có chiều dài thay đổi. Các ký tự được mã hóa bằng hai byte hoặc bốn byte. Tôi thực sự không nhìn thấy điểm. Nó có nhược điểm là chiều dài thay đổi, nhưng không có lợi thế là tiết kiệm không gian nhiều như UTF-8.

Trong số ba, rõ ràng UTF-8 là phổ biến rộng rãi nhất.


Tại sao tôi muốn tính độ dài của chuỗi trong khi phát triển trang web? Có bất kỳ lợi thế nào khi chọn UTF-8 / UTF-16 trong phát triển web không?
Morfidon

"Ưu điểm là bạn có thể dễ dàng tính toán độ dài của chuỗi" Nếu bạn xác định độ dài theo # của điểm mã, thì có, bạn chỉ có thể chia độ dài byte cho 4 để lấy chuỗi với UTF-32. Tuy nhiên, đó không phải là một định nghĩa rất hữu ích: nó có thể không liên quan đến số lượng ký tự. Ngoài ra, chuẩn hóa có thể thay đổi số lượng điểm mã trong chuỗi. Ví dụ, từ tiếng Pháp "été" có thể được mã hóa theo ít nhất 4 cách khác nhau, với 3 độ dài mã riêng biệt.

UTF-16 có thể nhanh hơn UTF-8 trong khi cũng không lãng phí bộ nhớ như UTF-32.
Michal tein

6

Tùy thuộc vào môi trường phát triển của bạn, bạn thậm chí có thể không có lựa chọn mã hóa kiểu dữ liệu chuỗi nào của mình sẽ sử dụng nội bộ.

Nhưng để lưu trữ và trao đổi dữ liệu, tôi sẽ luôn sử dụng UTF-8, nếu bạn có sự lựa chọn. Nếu bạn có hầu hết dữ liệu ASCII, điều này sẽ cung cấp cho bạn lượng dữ liệu nhỏ nhất để truyền, trong khi vẫn có thể mã hóa mọi thứ. Tối ưu hóa cho I / O tối thiểu là cách để đi trên các máy hiện đại.


Có thể cho rằng, điều quan trọng hơn nhiều so với yêu cầu không gian là thực tế, UTF-8 miễn nhiễm với endian. UTF-16 và UTF-32 chắc chắn sẽ phải đối phó với các vấn đề về tuổi thọ, trong đó UTF-8 chỉ đơn giản là một dòng octet.
IInspectable

2

Như đã đề cập, sự khác biệt chủ yếu là kích thước của các biến cơ bản, trong mỗi trường hợp sẽ lớn hơn để cho phép nhiều ký tự được biểu diễn.

Tuy nhiên, phông chữ, mã hóa và mọi thứ rất phức tạp (không cần thiết?), Vì vậy cần một liên kết lớn để điền chi tiết hơn:

http://www.cs.tut.fi/~jkorpela/chars.html#ascii

Đừng mong đợi để hiểu tất cả, nhưng nếu sau này bạn không muốn gặp vấn đề thì nên học càng nhiều càng tốt, càng sớm càng tốt (hoặc chỉ cần nhờ người khác sắp xếp nó cho bạn).

Paul.


hoặc chỉ sử dụng UTF-8 như mặc định vì nó đã trở thành tiêu chuẩn thực tế và tìm hiểu xem một hệ thống mới có hỗ trợ hay không. nếu không, bạn có thể quay lại bài này.
robotik

-2

Nói tóm lại, lý do duy nhất để sử dụng UTF-16 hoặc UTF-32 là để hỗ trợ các tập lệnh không phải tiếng Anh và cổ.

Tôi đã tự hỏi tại sao mọi người chọn mã hóa không phải UTF-8 khi nó rõ ràng hiệu quả hơn cho các mục đích lập trình / web.

Một quan niệm sai lầm phổ biến - số hậu tố KHÔNG phải là một dấu hiệu cho thấy khả năng của nó. Tất cả chúng đều hỗ trợ Unicode hoàn chỉnh, chỉ cần UTF-8 có thể xử lý ASCII bằng một byte duy nhất, do đó, HIỆU QUẢ / ít bị hỏng hơn đối với CPU và qua internet.

Một số cách đọc tốt: http://www.personal.psu.edu/ejp10/bloss/gotunicode/2007/10/which_utf_do_i_use.htmlhttp://utf8everywhere.org


Tôi không chắc chắn, tại sao bạn đề xuất rằng sử dụng UTF-16 hoặc UTF-32 là để hỗ trợ văn bản không phải tiếng Anh. UTF-8 có thể xử lý tốt. Và có những ký tự không phải ASCII trong văn bản tiếng Anh. Giống như một người không tham gia chiều rộng bằng không. Hoặc một dấu gạch ngang. Tôi sợ, câu trả lời này không thêm nhiều giá trị.
IInspectable

Câu hỏi này có khả năng hạ cấp vì UTF-8 vẫn được sử dụng phổ biến trong các tệp HTML ngay cả khi phần lớn các ký tự là các ký tự 3 byte trong UTF-8,
Ṃųỻịgǻňạcể ôn

Hỗ trợ @IInspectable không phải là từ ngữ tốt nhất, quảng bá hoặc hỗ trợ tốt hơn sẽ chính xác hơn
robotik

Gửi một trang như utf8everywhere.org không phải là điều tôi sẽ làm trong câu trả lời SO.
Michal Štein
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.