làm rõ các khái niệm cơ bản
Tôi chắc chắn rằng tất cả các bạn đều biết điều này ở một mức độ nào đó, nhưng bằng cách nào đó kiến thức đó bị mất đi trong các cuộc tranh luận văn bản, vì vậy trước tiên hãy nhắc lại một chút: máy tính không thể lưu trữ “chữ cái”, “số”, “ảnh” hoặc thứ gì đó khác. thứ duy nhất nó có thể lưu trữ và hoạt động là các 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 muốn gọi nó như thế nào. Vì máy tính chạy bằng điện, một bit về cơ bản có thể được biểu diễn bằng điện áp, xung dòng điện hoặc trạng thái điện của mạch lật. đối với con người, các bit thường được biểu thị bằng 1 và 0, vì vậy hãy coi đây là quy ước xuyên suốt bài viết này.
đang tìm kiếm: giải mã là gì
Để sử dụng các bit để biểu diễn bất kỳ thứ gì, chúng ta cần các quy tắc. chúng ta cần chuyển đổi một chuỗi các bit thành một cái gì đó như chữ cái, số và hình ảnh bằng cách sử dụng mã hóa hoặc lược đồ mã hóa. như thế này:
01100010 01101001 01110100 01110011b Trong bảng mã mạnh 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 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 bit nhất định. nếu bạn có một trí nhớ tốt để nhớ các chuỗi bit 26 chữ cái, bạn có thể đọc các bit như đọc sách.
lược đồ mã hóa
ở trên được gọi là ascii. một chuỗi số 1 và số 0 được chia thành nhiều phần, mỗi phần 8 bit (hoặc 1 byte). ascii chỉ định một bảng để con người có thể đọc được từ byte sang chữ cái. đây là một phần nhỏ của bảng đó:
có tổng số 95 ký tự mà con người có thể đọc được chỉ định trong bảng ascii, bao gồm các chữ cái từ a đến z ở cả chữ thường và chữ hoa, số từ 0 đến 9, một số dấu câu và các ký tự như đô la, dấu chấm than và một số thứ khác . nó cũng bao gồm 33 giá trị cho một số thứ như dấu cách, dấu xuống dòng, tab, dấu lùi, v.v. tất nhiên, những thứ này không thể in ra được, nhưng chúng vẫn có thể nhìn thấy dưới một số hình thức và hữu ích trực tiếp cho con người. một số giá trị chỉ hữu ích cho máy tính, chẳng hạn như mã để đánh dấu phần đầu và phần cuối của văn bản. Tổng số 128 ký tự được xác định trong bảng mã ascii, đây là một con số tốt (đối với những người quen thuộc với máy tính), vì nó sử dụng tất cả các kết hợp có thể có của 7 bit (0000000 đến 1111111).
và bây giờ chúng tôi có một cách để biểu diễn văn bản chỉ sử dụng 1 và 0:
01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100 cụm từ khóa “hello world” để mã hóa thứ gì đó trong ascii, theo bảng với các bit từ phải sang trái. Để giải mã một chuỗi các bit thành các ký tự có thể đọc được, hãy làm theo bảng từ trái sang phải, thay thế các bit bằng các chữ cái.
để mã hóa có nghĩa là sử dụng một cái gì đó để đại diện cho một cái gì đó khác. mã hóa là một tập hợp các quy tắc để thực hiện chuyển đổi đó.
một số thuật ngữ khác cần được làm rõ trong ngữ cảnh này:
bộ ký tự, bộ ký tự
tập hợp các ký tự có thể được mã hóa. “Mã hóa ASCII bao gồm một bộ ký tự gồm 128 ký tự.” về cơ bản đồng nghĩa với “mã hóa”.
trang mã
một “trang” mã để liên kết các ký tự với một chuỗi bit tương ứng. cũng có thể hiểu là một “bảng”. về cơ bản đồng nghĩa với “mã hóa”.
chuỗi
một chuỗi là một chuỗi các phần tử được liên kết với nhau. một chuỗi bit là một chuỗi các bit, như 01010011. một chuỗi ký tự là một chuỗi các ký tự, như thế này. đồng nghĩa với “trình tự”.
nhị phân, bát phân, thập phân, thập lục phân
Có nhiều cách để viết một số. 10011111 trong hệ nhị phân là 237 trong bát phân, 159 trong thập phân và 9f trong hệ thập lục phân. cả hai đều đại diện cho một giá trị, nhưng số thập lục phân ngắn hơn và dễ đọc hơn số nhị phân. tuy nhiên, tôi sẽ sử dụng nhị phân trong suốt bài viết này để làm cho vấn đề dễ hiểu hơn và cũng để loại bỏ một lớp trừu tượng. đừng lo lắng nếu bạn thấy ở đâu đó mã ký tự được viết trong một hệ thống khác, chúng đều giống nhau.
xin lỗi-moi?
Sau khi hiểu những điều trên, hãy trung thực: 95 ký tự là rất ít khi nói đến ngôn ngữ. có thể áp dụng cho tiếng Anh cơ bản, nhưng nếu chúng ta muốn viết một bức thư táo bạo bằng tiếng Pháp thì sao? straßenübergangsänderungsgesetz (luật đường bộ) trong tiếng Đức? một lời mời đến một smörgåsbord (tiệc đứng) bằng tiếng Thụy Điển? tốt, bạn không thể. không bằng ascii. không có hướng dẫn để diễn đạt các chữ cái như é, ß, ü, ä, ö hoặc å trong ascii, vì vậy chúng tôi không thể sử dụng nó.
xem thêm: bảng rút gọn là gì – chi tiết bài 04
“nhưng hãy nhìn xem”, người châu Âu nói, “trên một máy tính thông thường trong đó 1 byte bằng 8 bit, mã hóa ascii lãng phí 1 bit bằng cách luôn đặt giá trị của nó thành 0. chúng ta có thể sử dụng bit này để bao gồm 128 giá trị khác! trên bảng đó! ” và họ đã làm. nhưng ngay cả như vậy, có hơn 128 cách để nhấn trọng âm cho một nguyên âm. chúng tôi không thể đặt tất cả các biến thể của các chữ cái được sử dụng trong các ngôn ngữ của tất cả các nước châu Âu trong cùng một bảng với tối đa 256 giá trị. và sau đó thế giới chìm trong biển mã hóa, tiêu chuẩn, tiêu chuẩn thực tế và thậm chí là … bán tiêu chuẩn cho các bộ ký tự khác nhau. ai đó cần viết một văn bản tiếng Thụy Điển bằng tiếng Séc, anh ta không thể tìm thấy một bảng mã áp dụng cho cả hai ngôn ngữ, vì vậy anh ta phải tạo một bảng mã. và nó xảy ra hàng nghì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 Quốc và hàng nghìn ngôn ngữ khác được sử dụng trên trái đất. chưa kể những ngôn ngữ đã không còn được sử dụng. Khi bạn đã giải quyết được vấn đề làm thế nào để viết nhiều ngôn ngữ trong một văn bản với các ngôn ngữ trên, hãy thử thách bản thân bằng tiếng Trung. hoặc tiếng Nhật. cả hai ngôn ngữ đều chứa hàng chục nghìn ký tự. bạn có tối đa 256 giá trị trong một byte chứa 8 bit. phát triển!
bảng mã nhiều byte
Để tạo bảng ánh xạ ký tự sang ký tự cho một ngôn ngữ có hơn 256 ký tự, một byte đơn giản là không đủ. với 2 byte (16 bit) chúng ta có thể mã hóa tới 65.536 ký tự khác nhau. big-5 là một mã hóa sử dụng hình thức đó. thay vì tách một chuỗi bit ở khối 8, nó tách ở khối 16 và có một bảng khổng lồ (tức là rất lớn) ra lệnh cho các ký tự liên kết với chuỗi bit nào. big-5 ở dạng đơn giản nhất đã xử lý hầu hết các ký tự truyền thống của Trung Quốc. gb18030 là một bảng mã khác có cách tiếp cận tương tự, nhưng bao gồm cả tiếng Trung giản thể và phồn thể. và trước khi bạn hỏi, có, có những bảng mã khác chỉ dành cho tiếng Trung giản thể. Tôi chỉ muốn sử dụng 1 bảng mã, nhưng nó có khó đến vậy không?
Một phần nhỏ của bảng mã hóa gb18030 được hiển thị bên dưới:
gb18030 xử lý rất nhiều ký tự (bao gồm hầu hết các ký tự Latinh), nhưng cuối cùng thì đó chỉ là một định dạng mã hóa chuyên biệt trong số các định dạng khác. .
nhầm lẫn unicode
cuối cùng ai đó đã hiểu được nó và tạo ra một tiêu chuẩn mã hóa để thống nhất tất cả các tiêu chuẩn khác. tiêu chuẩn này được gọi là unicode. Về cơ bản nó xác định một bảng tối đa với 1.114.112 điểm mã có thể được sử dụng cho tất cả các loại chữ cái và ký hiệu. nó là quá đủ để mã hóa tất cả các ngôn ngữ châu Âu, Trung Đông, Viễn Đông, Nam, Bắc, Tây, tiền sử, và thậm chí cả tương lai mà con người chưa nghĩ ra. bằng cách sử dụng unicode, bạn có thể sắp chữ bằng hầu hết mọi ngôn ngữ bằng cách sử dụng bất kỳ ký tự nào bạn có thể nhập. điều này là không thể hoặc rất khó thực hiện trước khi unicode ra đời. thậm chí còn có một mục nhập không chính thức cho klingon (sao trek) bằng unicode. bạn thấy đấy, unicode tuyệt vời đến mức nó cũng cho phép sử dụng cá nhân.
Vậy thì Unicode sử dụng bao nhiêu bit để mã hóa tất cả các 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 dường như là. Đầu tiên, unicode định nghĩa một bảng chứa các điểm mã cho các ký tự. Nghe có vẻ nguy hiểm, nó giống như nói “65 có nghĩa là a, 66 có nghĩa là b, và 9,731 có nghĩa là ☃” (nghiêm túc). Làm thế nào các điểm mã này được mã hóa thành các bit là một câu chuyện khác. để giữ 1.114.112 giá trị khác nhau, 2 byte là không đủ. 3 byte là đủ, nhưng không ai sử dụng 3 byte, vì vậy 4 byte cuối cùng đã được chọn. nhưng trừ khi bạn đang sử dụng tiếng Trung hoặc các ngôn ngữ khác có nhiều ký tự yêu cầu nhiều bit để mã hóa, bạn sẽ không bao giờ sử dụng hầu hết 4 byte đó. nếu ký tự “a” luôn được mã hóa là 00000000 00000000 00000000 01000001, “b” trở thành 00000000 00000000 00000000 01000010, mỗi văn bản sẽ lớn hơn 4 lần so với kích thước thực.
Để tối ưu hóa vấn đề này, có nhiều cách để mã hóa điểm mã theo bit. utf-32 là một mã hóa mã hóa bất kỳ điểm mã nào sử dụng 32 bit. nghĩa là 4 byte cho mỗi ký tự. nó rất đơn giản, nhưng nó thường chiếm một kích thước rất lớn. utf-16 và utf-8 là hai kiểu mã hóa đa độ dài. Nếu một ký tự có thể được mã hóa bằng 1 byte (vì điểm mã của nó là một số rất nhỏ), thì utf-8 sẽ mã hóa nó bằng 1 byte. nếu ký tự chiếm 2 byte, nó sẽ mã hóa 2 byte, v.v. khi giải mã, byte đầu tiên của chuỗi sẽ được sử dụng để xác định số byte tạo nên ký tự, cụ thể:
chuỗi bắt đầu bằng mẫu bit “0” (0x00-0x7f) = & gt; chuỗi dài 1 byte. chuỗi bắt đầu bằng mẫu bit “110” (0xc0-0xdf) = & gt; chuỗi dài 2 byte. chuỗi bắt đầu bằng mẫu bit “1110” (0xe0-0xef) = & gt; chuỗi dài 3 byte. chuỗi bắt đầu bằng mẫu bit “11110” (0xf0-0xf7) = & gt; chuỗi dài 4 byte.
Sử dụng bit quan trọng nhất (msb) làm độ dài chuỗi thông báo có thể giúp giảm mức tiêu thụ bộ nhớ, nhưng vẫn có thể tốn kém nếu sử dụng quá thường xuyên. utf-16 cân bằng hơn, sử dụng ít nhất 2 byte, sẽ tăng lên 4 byte nếu cần.
Và đó là tất cả về Unicode. Unicode là một bảng lớn với mục đích liên kết các ký tự với các số và các loại mã hoá UTF khác nhau thì chỉ định cách thức mà những số này được mã hoá thành bit. Về cơ bản, Unicode cũng chỉ là một trong các encoding scheme và không có gì đặc biệt về nó ngoại trừ việc nó cố gắng để xử lý mọi thứ trong khi vẫn hoạt động một cách hiệu quả mà thôi. Và đó là một điều rất tốt.™
điểm mã
các ký tự được đại diện bởi “điểm mã” của chúng. điểm mã được viết bằng hệ thập lục phân (gọi tắt là), với tiền tố “u +” (không có ý nghĩa nào khác ngoài việc ngụ ý rằng đó là điểm mã unicode). ví dụ, ký tự Ḁ có điểm mã là u + 1e00. nói cách khác, nó là ký tự số 7680 trong bảng unicode. tên chính thức của nó là “chữ cái viết hoa Latinh a với vòng tròn bên dưới”.
quá dài, quá ngại để đọc
Một bản tóm tắt nhỏ ở trên: bất kỳ ký tự nào cũng có thể được mã hóa thành nhiều chuỗi bit khác nhau và bất kỳ chuỗi bit nào cũng có thể đại diện cho các ký tự khác nhau, tùy thuộc vào kiểu mã hóa được sử dụng để viết chúng. lý do đơn giản là các bảng mã khác nhau sử dụng số lượng bit khác nhau cho mỗi ký tự và các giá trị khác nhau thể hiện các ký tự khác nhau.
xem thêm: tỷ lệ ams là gì? ams có sẵn ở bất cứ nơi nào các container xuất đi đến
(Hết phần 1)
Bài viết này đã được dịch từ những điều mà mọi lập trình viên cần biết một cách tuyệt đối và tích cực về các bảng mã và bộ ký tự để làm việc với văn bản.