Làm rõ những khái niệm cơ bản
Chắc rằng tổng thể mọi người đều biết về điều này ở một mức độ nào đó, nhưng không hiểu sao những kỹ năng và kiến thức đó lại bị mất đi trong những cuộc tranh luận về văn bản, nên tiên phong hãy nhắc lại một chút ít : Máy tính không thể nào tàng trữ được “ chữ ”, “ số ”, “ ảnh ”, hay bất kỳ thứ gì khác. Thứ duy nhất mà nó hoàn toàn có thể lưu được và thao tác cùng đó là bit. Một bit chỉ hoàn toàn có thể có 2 giá trị : có hoặc không, đúng hoặc sai, 1 hoặc 0, bạn thích gọi theo cách nào cũng được. Vì máy tính hoạt động giải trí bằng điện, một bit thực ra hoàn toàn có thể được biểu lộ bằng điện áp, xung hiện tại hoặc trạng thái điện của mạch flip-flop. Đối với con người, bit thường được bộc lộ bằng 1 và 0 nên hãy coi đây là quy ước trong suốt bài viết này .
Đang xem : Decode là gì

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

01100010 01101001 01110100 01110011 b i t sTrong encoding này, 01100010 đại diện thay mặt cho chữ “ b ”, 01101001 cho chữ “ i ”, 01110100 cho chữ “ t ” và 01110011 cho chữ “ s ”. Một chuỗi những bit nhất định sẽ đại diện thay mặt cho một chữ và một chữ sẽ đại diện thay mặt cho một chuỗi những bit nhất định. Nếu bạn có trí nhớ tốt để nhớ được chuỗi bit cho 26 chữ thì bạn hoàn toàn có thể đọc bit như đọc sách vậy .
Encoding scheme trên được gọi là ASCII. Một chuỗi những số 1 và 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à con người hoàn toàn có thể đọc được. Dưới đây là một phần nhỏ của bảng đó :

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

Có tổng số 95 ký tự hoàn toàn có thể đọc được lao lý trong bảng ASCII, gồm có chữ từ A đến Z ở trạng thái thường và in hoa, số từ 0 đến 9, một số ít dấu chấm câu và những ký tự như đồng đô la, dấu chấm than và một vài thứ khác. Nó cũng gồm có 33 giá trị cho 1 số ít thứ như dấu cách, dấu xuống dòng, tab, backspace, … Những thứ này tất yếu không hề in ra được, nhưng cũng vẫn hữu hình ở 1 số ít dạng và có ích trực tiếp với con người. Một vài giá trị thì chỉ có ích với máy tính, như mã để lưu lại mở màn và kết thúc của văn bản. Tộng cộng có 128 ký tự được định nghĩa trong encoding ASCII, đó là một số lượng đẹp ( với những người quen thuộc với máy tính ), chính bới nó sử dụng hết tổng thể những phối hợp hoàn toàn có thể của 7 bit ( 0000000 cho đến 1111111 ) .
Và giờ thì tất cả chúng ta đã có cách để biểu lộ văn bản chỉ bằng việc sử dụng 1 và 0 :
01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100 “ Hello World ” Thuật ngữ quan trọngĐể encode một thứ gì đó bằng ASCII, làm theo bảng từ phải qua trái, thay thế sửa chữa những 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, thay thế sửa chữa những bit bằng chữ .
Encode nghĩa là sử dụng một thứ gì đó để bộc lộ cho một thứ khác. encoding là một tập hợp những quy tắc để thực thi việc quy đổi đó .
Một số thuật ngữ khác cần được làm rõ trong ngữ cảnh này :

character set, charset

Tập hợp những ký tự hoàn toàn có thể được encode. “ Mã hóa ASCII gồm có một bộ ký tự gồm 128 ký tự. ” Về cơ bản thì đồng nghĩa tương quan với “ encoding ” .

code page

Một “ trang ” những mã để link những ký tự với một chuỗi những bit tương ứng. Cũng hoàn toàn có thể hiểu là một “ bảng ”. Về cơ bản thì đồng nghĩa tương quan với “ encoding ” .

string

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

Binary, Octal, Decimal, Hex

Có rất nhiều cách để viết một số ít. 10011111 trong hệ nhị phân là 237 trong hệ bát phân, 159 trong hệ thập phân và 9F trong hệ thập lục phân. Chúng đều biểu lộ một giá trị, nhưng số thập lục phân lại ngắn gọn hơn và dễ đọc hơn so với số nhị phân. Tuy vậy tôi sẽ dùng nhị phân trong suốt bài viết này để làm yếu tố trở nên dễ hiểu hơn cũng như vô hiệu bớt được một lớp trừu tượng. Đừng lo nếu bạn thấy ở đâu đó những mã ký tự lại được viết ở hệ khác nhé, chúng như nhau cả thôi .
Excusez-Moi ?
Sau khi đã nắm rõ những ý trên rồi thì cùng thú thật với nhau nào : 95 ký tự là quá ít khi tất cả chúng ta nói về những ngôn từ. Nó hoàn toàn có thể vận dụng cho tiếng Anh cơ bản, nhưng sẽ thế nào nếu tất cả chúng ta muốn viết một risqué letter ( thư báo rủi ro đáng tiếc ) bằng tiếng Pháp ? Straßen ­ übergangs ­ änderungs ­ gesetz ( luật đường đi bộ ) trong tiếng Đức ? Một lời mời đến tiệc smörgåsbord ( tiệc đứng ) bằng tiếng Thụy Điển ? Ờm, bạn không hề. Không thể bằng ASCII. Không có một hướng dẫn nào cho việc bộc lộ những chữ như é, ß, ü, ä, ö or å trong ASCII, nên tất cả chúng ta không hề dùng nó được .
Xem thêm : Truncate Table Là Gì – Chi Tiết Bài Học 04
“ Nhưng nhìn xem, ” dân châu Âu nói, “ trong một cái máy tính thông dụng với 1 byte bằng 8 bit, mã hóa ASCII đang làm phí phạm hẳn 1 bit khi luôn set giá trị của nó là 0 ! Chúng ta hoàn toàn có thể dùng bit này để nhét thêm tận 128 giá trị vào cái bảng đó ! ” Và họ đã làm như vậy. Nhưng kể cả thế, có nhiều hơn 128 cách để đặt dấu cho một nguyên âm. Chúng ta không thể nào đưa hết tổng thể những biến thể của vần âm được dùng trong những ngôn từ của toàn Châu Âu vào trong cùng một bảng với tối đa 256 giá trị được. Và sau đó quốc tế chìm ngập trong một biển những encoding, những tiêu chuẩn, những tiêu chuẩn trong thực tiễn và thậm chí còn là … nửa tiêu chuẩn để dùng cho những bộ ký tự khác nhau. Một người nào đó cần phải viết một văn bản về tiếng Thụy Điển bằng tiếng Séc, tìm không ra encoding nào vận dụng cho cả 2 ngôn từ này nên đành tự chế ra một cái. Và chuyện đó diễn ra hàng ngàn lần .

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

Mã hóa đa byte ( Multi-Byte Encodings )
Để tạo ra một bảng link những ký tự với vần âm cho một ngôn từ có nhiều hơn 256 ký tự, một byte đơn thuần là không đủ. Với 2 byte ( 16 bit ), tất cả chúng ta hoàn toàn có thể mã hóa tới 65,536 ký tự khác nhau. BIG-5 là một encoding sử dụng cách đó. Thay vì tách một chuỗi những bit thành block 8, nó tách thành block 16 và có một cái bảng khổng lồ ( ý tôi là, KHỔNG LỒ ) pháp luật việc ký tự nào thì link cùng chuỗi bit nào. BIG-5 ở thể đơn thuần nhất đã giải quyết và xử lý hầu hết những ký tự của tiếng Trung phồn thể. GB18030 là một encoding khác cũng có cách tiếp cận tựa như, nhưng nó gồm có cả tiếng Trung giản thể và phồn thể luôn. Và trước khi bạn hỏi, thì đúng vậy, có cả những encoding khác chỉ dành cho tiếng Trung giản thể thôi. Tôi chỉ muốn dùng 1 encoding thôi mà cũng khó khăn vất vả 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 giải quyết và xử lý một lượng lớn những ký tự ( gồm có cả phần nhiều những ký tự La tinh ), tuy nhiên ở đầu cuối thì nó cũng chỉ là một định dạng mã hóa chuyên biệt trong hàng hà sa số những cái khác thôi .
Sự bồn chồn mang tên Unicode
Cuối cùng thì cũng có người chịu hết nổi và đã đứng lên tạo ra một chuẩn mã hóa để hợp nhất toàn bộ những chuẩn khác. Chuẩn này được gọi là Unicode. Về cơ bản nó định nghĩa một bảng lớn cực lớn với 1,114,112 những code point hoàn toàn có thể được dùng cho mọi loại vần âm và hình tượng. Nó thừa đủ để mã hóa hàng loạt tiếng châu Âu, Trung Đông, Viễn Đông, miền Nam, miền Bắc, miền Tây, tiền sử và cả những ngôn từ tương lai mà con người chưa nghĩ ra. Sử dụng Unicode, bạn hoàn toàn có thể soạn văn bản chứa gần như mọi ngôn từ bằng mọi ký tự mà bạn hoàn toàn có thể gõ ra. Điều này hoặc là bất khả thi hoặc rất rất khó để triển khai trước khi Unicode sinh ra. Thậm chí còn có một mục không chính thức dành cho tiếng Klingon ( Star Trek ) trong Unicode. Bạn thấy đó, Unicode lớn đến nỗi nó cũng được cho phép dùng vào mục tiêu cá thể luôn .

*

Vậy thì Unicode sử dụng bao nhiêu bit để mã hóa toàn bộ những ký tự đó ? 0. Bởi vì Unicode không phải một loại mã hóa ( encoding ) .
Bối rối ? Nhiều người có vẻ như như vậy. Đầu tiên, Unicode định nghĩa ra một bảng chứa những code point cho những ký tự. Nghe có vẻ như nguy hại vậy thôi, nó cũng như là nói “ 65 đại diện thay mặt cho A, 66 cho B và 9,731 cho ☃ ” ( thật đấy ). Làm thế nào mà những code point này được mã hóa thành bit thì lại là một câu truyện khác. Để chứa 1,114,112 giá trị khác nhau, 2 byte là không đủ. 3 byte thì đủ, nhưng chả ai dùng 3 byte cả, nên ở đầu cuối 4 byte đã được chọn. Nhưng, trừ khi bạn dùng tiếng Trung hoặc những thứ tiếng khác với một lượng lớn những ký tự mà cần nhiều bit để mã hóa, bạn sẽ chẳng khi nào dùng hết phần nhiều 4 byte đó cả. Nếu chữ “ A ” luôn được mã hóa thành 00000000 00000000 00000000 01000001, “ B ” thì thành 00000000 00000000 00000000 01000010, .. mọi văn bản sẽ có size tăng lên 4 lần so với kích cỡ thực .
Để tối ưu hóa yếu tố này, có rất nhiều cách để mã hóa code point thành bit. UTF-32 là một encoding có công dụng mã hóa mọi code point sử dụng 32 bit. Nghĩa là, 4 byte trên một ký tự. Nó rất đơn thuần, nhưng thường thì chiếm kích cỡ quá lớn. UTF-16 và UTF-8 là 2 loại mã hóa đa chiều dài. Nếu một ký tự hoàn toàn có thể được mã hóa bằng 1 byte ( chính do code point của nó là 1 số ít rất nhỏ ), UTF-8 sẽ mã hóa nó bằng 1 byte. Nếu ký tự cần tới 2 byte, nó sẽ mã hóa bằng 2 byte, vân vân. Khi giải thuật ( decode ), byte tiên phong trong chuỗi sẽ được sử dụng để xác lập số byte cấu trúc thành ký tự, đơn cử :
Chuỗi khởi đầu bằng mẫu bit “ 0 ” ( 0x00 – 0x7 f ) => chuỗi dài 1 byte. Chuỗi khởi đầu bằng mẫu bit “ 110 ” ( 0 xc0 – 0 xdf ) => chuỗi dài 2 byte. Chuỗi khởi đầu bằng mẫu bit “ 1110 ” ( 0 xe0 – 0 xef ) => chuỗi dài 3 byte. Chuỗi khởi đầu bằng mẫu bit “ 11110 ” ( 0 xf0 – 0 xf7 ) => chuỗi dài 4 byte .
Việc sử dụng bit có trọng số cao nhất ( MSB ) làm tín hiệu thông tin độ dài chuỗi hoàn toàn có thể giúp giảm hao tốn bộ nhớ, nhưng vẫn sẽ tốn kém nếu được dùng quá liên tục. UTF-16 thì cân đối hơn, dùng tối thiểu 2 byte, sẽ tăng lên đến 4 byte nếu cần .

*

Và đó là tổng thể về Unicode. Unicode là một bảng lớn với mục tiêu link những ký tự với những số và những loại mã hoá UTF khác nhau thì chỉ định phương pháp mà những số này được mã hoá thành bit. Về cơ bản, Unicode cũng chỉ là một trong những encoding scheme và không có gì đặc biệt quan trọng về nó ngoại trừ việc nó nỗ lực để giải quyết và xử lý mọi thứ trong khi vẫn hoạt động giải trí một cách hiệu suất cao mà thôi. Và đó là một điều rất tốt. ™
Code Points
Các ký tự được bộc lộ trải qua “ code point ” của nó. Code point được viết dưới hệ thập lục phân ( để làm cho nó ngắn hơn ), được khởi đầu bằng “ U + ” ( không có ý nghĩa gì ngoài việc ám chỉ đây 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ý tự số 7680 của bảng Unicode. Tên gọi chính thức của nó là “ LATIN CAPITAL LETTER A WITH RING BELOW ” ( Chữ la tinh viết hoa A với vòng tròn ở dưới ) .

*

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

Xem thêm: Phí Ams Là Gì – Container Xuất Khẩu Đi Đâu Thì Có Ams

*

( Hết phần 1 )
Bài viết được dịch từ What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text .

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *