1 ký tự bao nhiêu byte

-
Làm rõ những khái niệm cơ bản

Chắc rằng tất cả mọi tín đồ đều biết về vấn đề này ở một mức độ như thế nào đó, nhưng không hiểu sao những kiến thức đó lại bị mất đi trong số cuộc tranh luận về văn bản, nên thứ nhất hãy nói lại một chút: máy tính không thể nào tàng trữ được “chữ”, “số”, “ảnh”, hay bất cứ thứ gì khác. Sản phẩm duy nhất mà nó rất có thể lưu được và làm việc cùng chính là bit. Một bit chỉ hoàn toàn có thể có 2 giá trị: tất cả hoặc không, đúng hoặc sai, 1 hoặc 0, bạn muốn gọi theo cách nào thì cũng được. Bởi vì máy tính hoạt động bằng điện, một bit thực chất có thể được thể hiện bằng điện áp, xung hiện tại hoặc trạng thái năng lượng điện của mạch flip-flop. Đối với nhỏ người, bit hay được bộc lộ bằng 1 với 0 cho nên hãy coi đó là quy cầu trong suốt nội dung bài viết này.

Bạn đang xem: 1 ký tự bao nhiêu byte

Để sử dụng bit để thể hiện cho bất cứ thứ gì, chúng ta cần những quy tắc. Bọn họ cần phải đổi khác một chuỗi các bit thành thứ gì đó như chữ, số và ảnh bằng cách áp dụng một encoding scheme (lược đồ dùng mã hóa), hoặc hotline tắt là encoding. Như thế này:

01100010 01101001 01110100 01110011b i t sTrong encoding này, 01100010 đại diện thay mặt cho chữ "b", 01101001 đến chữ "i", 01110100 đến chữ "t" với 01110011 đến chữ "s". Một chuỗi những bit khăng khăng sẽ thay mặt đại diện cho một chữ với một chữ sẽ thay mặt đại diện cho một chuỗi các bit duy nhất định. Nếu khách hàng có trí nhớ xuất sắc để lưu giữ được chuỗi bit mang đến 26 chữ thì chúng ta cũng có thể đọc bit như xem sách vậy.

Encoding scheme bên trên được điện thoại tư vấn là ASCII. Một chuỗi những số 1 cùng 0 được chia ra thành nhiều phần, mỗi phần 8 bit (hoặc 1 byte). ASCII pháp luật một bảng để dịch tự byte sang vần âm mà nhỏ người có thể đọc được. Tiếp sau đây là 1 phần nhỏ của bảng đó:

bitscharacter
01000001A
01000010B
01000011C
01000100D
01000101E
01000110F

Có tổng số 95 ký kết tự có thể đọc được dụng cụ trong bảng ASCII, bao hàm chữ từ A mang đến Z làm việc trạng thái thường với in hoa, số trường đoản cú 0 mang lại 9, một số dấu chấm câu và các ký tự như đồng đô la, dấu chấm than cùng một vài máy khác. Nó cũng bao hàm 33 quý hiếm cho một số thứ như vệt cách, vệt xuống dòng, tab, backspace,... đa số thứ này tất nhiên không thể in ra được, dẫu vậy cũng vẫn hữu hình ở một trong những dạng và bổ ích trực tiếp với bé người. Một vài quý hiếm thì chỉ bổ ích với thiết bị tính, như mã để tiến công dấu bước đầu và chấm dứt của văn bản. Tộng cộng tất cả 128 ký kết tự được quan niệm trong encoding ASCII, đó là 1 con số đẹp (với rất nhiều người thân thuộc với trang bị tính), bởi vì nó áp dụng hết toàn bộ các kết hợp hoàn toàn có thể của 7 bit (0000000 cho đến 1111111).

Và giờ đồng hồ thì bọn họ đã có cách để thể hiện tại văn bản chỉ bằng việc thực hiện 1 cùng 0:

01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100 "Hello World"Thuật ngữ quan lại trọngĐể encode một thứ nào đó bằng ASCII, làm theo bảng từ cần qua trái, sửa chữa thay thế các chữ bằng những bit. Để decode một chuỗi những bit thành những ký tự hoàn toàn có thể đọc được, làm theo bảng từ trái qua phải, sửa chữa các bit bởi chữ.

Encode nghĩa là thực hiện một thứ gì đó để biểu đạt cho một sản phẩm công nghệ khác. Encoding là một tập hợp những quy tắc để tiến hành việc biến đổi đó.

Một số thuật ngữ khác cần được thiết kế rõ trong ngữ cảnh này:

character set, charset

Tập hợp những ký tự có thể được encode. "Mã hóa ASCII bao gồm 1 bộ ký kết tự bao gồm 128 ký tự." Về cơ phiên bản thì đồng nghĩa với "encoding".

code page

Một "trang" những mã nhằm liên kết các ký từ bỏ với một chuỗi các bit tương ứng. Cũng rất có thể hiểu là một "bảng". Về cơ phiên bản thì đồng nghĩa tương quan với "encoding".

string

Một string là một số các thành phần được xâu lại cùng với nhau. Một chuỗi bit là 1 trong những loạt các bit, như 01010011. Một chuỗi ký kết tự là 1 trong loạt những ký tự, như thế này. Đồng nghĩa với "sequence".

Binary, Octal, Decimal, Hex

Có hết sức nhiều cách để viết một số. 10011111 vào hệ nhị phân là 237 vào hệ chén bát phân, 159 vào hệ thập phân và 9F vào hệ thập lục phân. Chúng đều thể hiện một giá bán trị, nhưng lại số thập lục phân lại gọn ghẽ hơn với dễ hiểu hơn so với số nhị phân. Thế nhưng tôi sẽ sử dụng nhị phân trong suốt nội dung bài viết này để triển khai vấn đề trở nên dễ hiểu hơn cũng tương tự loại loại bỏ được một tấm trừu tượng. Đừng lo nếu bạn thấy nơi đâu đó những mã ký tự lại được viết ở hệ khác nhé, chúng giống hệt cả thôi.

Excusez-Moi?

Sau khi đã nắm rõ những ý trên rồi thì thuộc thú thiệt với nhau nào: 95 cam kết tự là quá ít khi bọn họ nói về những ngôn ngữ. Nó rất có thể áp dụng mang lại tiếng Anh cơ bản, nhưng sẽ vắt nào nếu chúng ta muốn viết một risqué letter (thư báo đen đủi ro) bằng tiếng Pháp? Straßen­übergangs­änderungs­gesetz (luật mặt đường bộ) trong giờ đồng hồ Đức? Một lời mời cho tiệc smörgåsbord (tiệc đứng) bằng tiếng Thụy Điển? Ờm, chúng ta không thể. Ko thể bởi ASCII. Không tồn tại một chỉ dẫn nào cho bài toán thể hiện các chữ như é, ß, ü, ä, ö or å vào ASCII, nên họ không thể cần sử dụng nó được.

Xem thêm: Nam Châm Có Hút Vàng Không, Nam Châm Có Hút Vàng Bạc Không

"Nhưng quan sát xem," dân châu Âu nói, "trong một cái máy vi tính thông dụng với cùng 1 byte bằng 8 bit, mã hóa ASCII đang làm chi phí phạm hẳn 1 bit khi luôn luôn set giá bán trị của nó là 0! bạn cũng có thể dùng bit này nhằm nhét thêm tận 128 giá trị vào tấm bảng đó!" với họ đã có tác dụng như vậy. Nhưng bao gồm cả thế, có rất nhiều hơn 128 phương pháp để đặt dấu cho một nguyên âm. Họ không thể nào chuyển hết toàn bộ các đổi mới thể của vần âm được dùng trong số ngôn ngữ của toàn Châu Âu vào trong và một bảng với về tối đa 256 quý giá được. Và sau đó thế giới chìm chìm ngập trong một biển các encoding, những tiêu chuẩn, những tiêu chuẩn thực tế và thậm chí là... Nửa tiêu chuẩn chỉnh để dùng cho các bộ ký tự không giống nhau. Một người nào đó rất cần phải viết một văn bản về giờ Thụy Điển bởi tiếng Séc, tìm không ra encoding nào áp dụng cho tất cả 2 ngôn từ này yêu cầu đành từ chế ra một cái. Với chuyện đó diễn ra hàng nghìn lần.

Và cũng nhớ rằng tiếng Nga, giờ Ấn Độ, giờ Ả Rập, tiếng do Thái, giờ Hàn và hàng ngàn ngôn ngữ khác đang được dùng bên trên trái đất. Không kể các ngôn ngữ đã mất được cần sử dụng nữa. Một khi chúng ta đã giải được vấn đề làm nuốm nào nhằm viết nhiều ngữ điệu trong cùng một văn phiên bản với những thứ giờ trên, hãy thử thách bản thân bởi tiếng Trung. Hoặc giờ Nhật. Cả 2 ngôn ngữ này cất cả chục nghìn cam kết tự. Các bạn có tối đa 256 quý giá trong một byte cất 8 bit. Triển!

Mã hóa đa byte (Multi-Byte Encodings)

Để tạo ra một bảng liên kết các ký từ với vần âm cho một ngôn ngữ có khá nhiều hơn 256 ký kết tự, một byte dễ dàng là ko đủ. Với 2 byte (16 bit), bạn cũng có thể mã hóa tới 65,536 ký kết tự không giống nhau. BIG-5 là một trong những encoding áp dụng cách đó. Rứa vì bóc tách một chuỗi các bit thành block 8, nó tách bóc thành block 16 và có một cái bảng kếch xù (ý tôi là, KHỔNG LỒ) quy định vấn đề ký tự làm sao thì link cùng chuỗi bit nào. BIG-5 ngơi nghỉ thể đơn giản và dễ dàng nhất đang xử lý hầu như các ký tự của tiếng Trung phồn thể. GB18030 là một trong những encoding khác cũng có cách tiếp cận tương tự, nhưng mà nó bao hàm cả tiếng Trung giản thể cùng phồn thể luôn. Với trước khi bạn hỏi, thì đúng vậy, có cả những encoding không giống chỉ dành riêng cho tiếng Trung giản thể thôi. Tôi chỉ mong muốn dùng 1 encoding thôi cơ mà cũng trở ngại thế sao?

Dưới đây là một phần nhỏ của bảng mã hóa GB18030:

bitscharacter
10000001 01000000
10000001 01000001
10000001 01000010
10000001 01000011
10000001 01000100

GB18030 xử lý một lượng lớn những ký trường đoản cú (bao bao gồm cả đa số các ký kết tự La tinh), mặc dù nhiên ở đầu cuối thì nó cũng chỉ là một định dạng mã hóa chuyên biệt trong sản phẩm hà sa số những cái khác thôi.

Sự hoảng loạn mang thương hiệu Unicode

Cuối thuộc thì cũng đều có người chịu đựng hết nổi với đã đứng lên tạo nên một chuẩn chỉnh mã hóa nhằm hợp nhất tất cả các chuẩn khác. Chuẩn chỉnh này được điện thoại tư vấn là Unicode. Về cơ bản nó có mang một bảng lớn cực lớn với 1,114,112 các code point hoàn toàn có thể được dùng cho phần lớn loại chữ cái và biểu tượng. Nó vượt đủ để mã hóa cục bộ tiếng châu Âu, Trung Đông, Viễn Đông, miền Nam, miền Bắc, miền Tây, lịch sử từ trước và cả những ngôn ngữ tương lai nhưng mà con người chưa nghĩ về ra. Thực hiện Unicode, bạn cũng có thể soạn văn bạn dạng chứa gần như mọi ngữ điệu bằng rất nhiều ký tự mà chúng ta có thể gõ ra. Điều này hoặc là bất khả thi hoặc vô cùng rất cạnh tranh để tiến hành trước lúc Unicode ra đời. Thậm chí còn tồn tại một mục không bao gồm thức giành riêng cho tiếng Klingon (Star Trek) vào Unicode. Các bạn thấy đó, Unicode khủng đến nỗi nó cũng có thể chấp nhận được dùng vào mục đích cá thể luôn.

*

Vậy thì Unicode áp dụng bao nhiêu bit nhằm mã hóa toàn bộ các cam kết tự đó? 0. Cũng chính vì Unicode chưa phải một các loại mã hóa (encoding).

Bối rối? các người có vẻ như vậy. Đầu tiên, Unicode định nghĩa ra một bảng chứa các code point cho các ký tự. Nghe tất cả vẻ nguy hại vậy thôi, nó cũng tương tự là nói "65 thay mặt đại diện cho A, 66 cho B với 9,731 cho ☃" (thật đấy). Làm ráng nào mà phần lớn code point này được mã trở thành bit thì lại là 1 trong những câu chuyện khác. Để chứa 1,114,112 cực hiếm khác nhau, 2 byte là ko đủ. 3 byte thì đủ, tuy thế chả ai dùng 3 byte cả, nên cuối cùng 4 byte đã được chọn. Nhưng, trừ khi chúng ta dùng giờ Trung hoặc những thứ tiếng không giống với một lượng lớn những ký trường đoản cú mà bắt buộc nhiều bit nhằm mã hóa, bạn sẽ chẳng lúc nào dùng hết đa phần 4 byte đó cả. Giả dụ chữ "A" luôn luôn được mã biến thành 00000000 00000000 00000000 01000001, "B" thì thành 00000000 00000000 00000000 01000010,.. đều văn bạn dạng sẽ có form size tăng lên 4 lần so với form size thực.

Để về tối ưu hóa sự việc này, bao gồm rất nhiều phương pháp để mã hóa code point thành bit. UTF-32 là 1 trong encoding có công dụng mã hóa phần đông code point áp dụng 32 bit. Nghĩa là, 4 byte bên trên một cam kết tự. Nó rất 1-1 giản, nhưng mà thường thì chiếm kích thước quá lớn. UTF-16 cùng UTF-8 là 2 một số loại mã hóa nhiều chiều dài. Ví như một ký kết tự rất có thể được mã hóa bởi 1 byte (bởi vì chưng code point của nó là một vài rất nhỏ), UTF-8 đang mã hóa nó bởi 1 byte. Nếu ký kết tự nên tới 2 byte, nó đang mã hóa bằng 2 byte, vân vân. Khi giải thuật (decode), byte trước tiên trong chuỗi sẽ được sử dụng để khẳng định số byte kết cấu thành ký kết tự, cầm cố thể:

Chuỗi bắt đầu bằng mẫu bit "0" (0x00-0x7f) => chuỗi lâu năm 1 byte.Chuỗi ban đầu bằng chủng loại bit "110" (0xc0-0xdf) => chuỗi lâu năm 2 byte.Chuỗi bước đầu bằng mẫu bit "1110" (0xe0-0xef) => chuỗi nhiều năm 3 byte.Chuỗi ban đầu bằng mẫu mã bit "11110" (0xf0-0xf7) => chuỗi lâu năm 4 byte.

Việc áp dụng bit tất cả trọng số cao nhất (MSB) có tác dụng tín hiệu thông tin độ nhiều năm chuỗi rất có thể giúp giảm hao tốn cỗ nhớ, tuy nhiên vẫn đang tốn nhát nếu được sử dụng quá hay xuyên. UTF-16 thì cân đối hơn, dùng ít nhất 2 byte, đang tăng lên đến 4 byte ví như cần.

*

Và đó là toàn bộ về Unicode. Unicode là 1 trong những bảng béo với mục đích liên kết những ký từ với những số và những loại mã hoá UTF khác biệt thì chỉ định phương pháp mà phần nhiều số này được mã hoá thành bit. Về cơ bản, Unicode cũng chỉ là một trong những trong những encoding scheme và không có gì đặc trưng về nó ngoại trừ vấn đề nó nỗ lực để xử lý phần nhiều thứ trong những lúc vẫn chuyển động một cách hiệu quả mà thôi. Và đó là 1 trong những điều khôn cùng tốt.™

Code Points

Các ký tự được thể hiện thông qua "code point" của nó. Code point được viết dưới hệ thập lục phân (để tạo nên nó ngắn hơn), được bắt đầu bằng "U+" (không có ý nghĩa sâu sắc gì ngoài việc ám chỉ đó là một code point của Unicode). Ví dụ, ký tự Ḁ có code point là U+1E00. Theo cách nói khác, nó là ký kết tự số 7680 của bảng Unicode. Tên gọi chính thức của chính nó là "LATIN CAPITAL LETTER A WITH RING BELOW" (Chữ la tinh viết hoa A với vòng tròn ngơi nghỉ dưới).

*

Dài quá, trinh nữ đọc

Một chút bắt tắt những ý trên: hầu như ký tự rất có thể được mã hoá thành các chuỗi bit khác biệt và bất chứ chuỗi bit nào cũng có thể thể hiện các ký tự không giống nhau, tuỳ trực thuộc vào nhiều loại mã hoá nào được dùng để viết chúng ra. Lí do dễ dàng chỉ vì những mã hoá khác nhau thì sử dụng số bit không giống nhau với mỗi ký kết tự và những giá trị không giống nhau thì thể hiện các ký tự không giống nhau.

*

(Hết phần 1)

Bài viết được dịch trường đoản cú What Every Programmer Absolutely, Positively Needs lớn Know About Encodings & Character Sets to Work With Text.