Decode là gì

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

Chắc rằng tất cả 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 kiến thức đó lại bị mất đi trong các cuộc tranh luận về văn bản, nên đầu tiên hãy nhắc lại một chút: Máy tính không thể nào lưu trữ được “chữ”, “số”, “ảnh”, hay bất cứ thứ gì khác. Thứ duy nhất mà nó có thể lưu được và làm việc cùng đó là bit. Một bit chỉ 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 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 điện của mạch flip-flop. Đối với con người, bit thường được biểu thị bằng 1 và 0 nên hãy coi đây là quy ước trong suốt bài viết này.

Bạn đang xem: Decode là gì

Để dùng bit để biểu lộ cho bất kỳ thứ gì, tất cả chúng ta cần những quy tắc. Chúng ta cần phải quy đổi một chuỗi những 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 01110011b i t sTrong encoding này, 01100010 đại diện cho chữ “b”, 01101001 cho chữ “i”, 01110100 cho chữ “t” và 01110011 cho chữ “s”. Một chuỗi các bit nhất định sẽ đại diện cho một chữ và một chữ sẽ đại diện cho một chuỗi các bit nhất định. Nếu bạn có trí nhớ tốt để nhớ được chuỗi bit cho 26 chữ thì bạn có thể đọc bit như đọc sách vậy.

Bạn đang đọc: Decode là gì

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 lao lý 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 đó :bitscharacter01000001A01000010B01000011C01000100D01000101E01000110FCó 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 ở một 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ã để ghi 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 do nó sử dụng hết toàn bộ những tích 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 để bộc 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à 1 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 1 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?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 chúng ta nói về các ngôn ngữ. Nó có thể áp dụng cho tiếng Anh cơ bản, nhưng sẽ thế nào nếu chúng ta muốn viết một risqué letter (thư báo rủi ro) bằng tiếng Pháp? Straßen­übergangs­änderungs­gesetz (luật đường 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 thể. Không thể bằng ASCII. Không có một chỉ dẫn nào cho việc thể hiện các chữ như é, ß, ü, ä, ö or å trong ASCII, nên chúng ta không thể 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 toàn bộ 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 từ khác đang được dùng trên toàn cầu. Chưa kể những ngôn từ đã 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 từ trong cùng một văn bản với những 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 từ 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)

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 :bitscharacter10000001 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ả hầu hết những ký tự La tinh ), tuy nhiên sau 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ối rối mang tên UnicodeSự hoảng sợ mang tên UnicodeCuố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 sau 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 hầu hết 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ó kích cỡ tăng lên 4 lần so với size 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ó tính nă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 bới code point của nó là một 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 bắt đầu bằng mẫu bit “0” (0x00-0x7f) => chuỗi dài 1 byte.Chuỗi bắt đầu bằng mẫu bit “110” (0xc0-0xdf) => chuỗi dài 2 byte.Chuỗi bắt đầu bằng mẫu bit “1110” (0xe0-0xef) => chuỗi dài 3 byte.Chuỗi bắt đầu bằng mẫu bit “11110” (0xf0-0xf7) => chuỗi dài 4 byte.Chuỗi khởi đầu bằng mẫu bit ” 0 ” ( 0x00 – 0x7 f ) => chuỗi dài 1 byte. Chuỗi mở màn bằng mẫu bit ” 110 ” ( 0 xc0 – 0 xdf ) => chuỗi dài 2 byte. Chuỗi mở màn bằng mẫu bit ” 1110 ” ( 0 xe0 – 0 xef ) => chuỗi dài 3 byte. Chuỗi mở màn 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á tiếp 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ó cố gắng 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 PointsCode PointsCác ký tự được biểu 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 các ý trên: Mọi ký tự 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 có thể thể hiện các 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 giản chỉ vì các mã hoá khác nhau thì sử dụng số bit khác nhau với mỗi ký tự và các giá trị khác nhau thì thể hiện các 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 .
Chuyên mục: Chuyên mục : Hỏi Đáp

5/5 - (1 vote)

Bài viết liên quan

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments