Mã Hóa Ký Tự Thành Số

     

Nếu câu vấn đáp bạn lựa chọn là Đúng, xin chúc mừng, chúng ta đã sai, đừng bi thương vì ít ra bạn đã có một bạn bè là bản thân =))

Một điều mà các người đến nay vẫn nhầm tưởng là Unicode áp dụng 16 bit để mã hóa, vì thế nó chỉ rất có thể mã hóa tối đa 65536 ký kết tự. Điều này trọn vẹn không chủ yếu xác.

Bạn đang xem: Mã hóa ký tự thành số

Thực ra, phiên bạn dạng đầu tiên của Unicode đúng là sử dụng 16 bit để mã hóa, từ năm 1991 mang lại 1995. Nhưng kể từ khi Unicode 2.0 thành lập và hoạt động (06/1996), nó không thể sử dụng chỉ 16 bit để mã hóa nữa. Chuẩn chỉnh Unicode mã hóa cam kết tự vào dải từ U+0000 mang lại U+10FFFF, tức là bao gồm không gian mã khoảng tầm 21 bit. Tùy vào cách làm mã hóa được sử dụng (UTF-8, UTF-16, UTF-32), mỗi ký tự sẽ tiến hành biểu diễn vị một chuỗi trường đoản cú 1-4 đơn vị mã 8 bit (tương đương 1-4 byte), từ bỏ 1-2 đơn vị chức năng mã 16 bit, hoặc chỉ một đơn vị chức năng mã 32 bit duy nhất.

Trước lúc Unicode ra đời, nhân loại đã tồn tại hàng ngàn hệ mã hóa, tuy vậy lại chưa có bất kỳ hệ nào tàng trữ được rất đầy đủ mọi cam kết tự. Trông rất nổi bật nhất chắc chắc hẳn rằng là ASCII, bảng mã dựa trên chữ cái Latin được sử dụng trong giờ Anh hiện đại.

Chính xác thì ASCII sử dụng 7 bit màn trình diễn với 7 số nhị phân (thập phân từ 0 mang đến 127). Từ bỏ 32 mang lại 127 là mọi ký trường đoản cú in được, tức là hiển thị được, lấy ví dụ như " " là 32, chữ cái "A" là 65. Mã bên dưới 32 được dùng làm biểu diễn ký tự điều khiển (control character), ví như nút ESC, Backspace.

Rõ ràng chỉ cách 7, thậm bỏ ra là 8 bit, chúng ta chỉ biểu diễn được buổi tối đa 256 ký kết tự, từng kia quá đầy đủ với giờ đồng hồ Anh, tuy vậy với ngôn ngữ không giống thì ko thể. Vậy các hệ mã hóa khác thì sao? những hệ mã hóa đó lại xung đột nhiên với nhau. Lấy một ví dụ cả hai hầu như cùng sử dụng một trong những để biểu diễn hai cam kết tự khác biệt, hoặc lại sử dụng hai số khác biệt để trình diễn cùng một cam kết tự. Từng một máy vi tính đều hỗ trợ nhiều chuẩn chỉnh mã hóa, bởi vì vậy mà mọi khi dữ liệu được trao đổi giữa các chuẩn chỉnh mã hóa thì nguy cơ rơi lệch luôn tồn tại.

Unicode thành lập để giải quyết và xử lý vấn đề này. Nó hỗ trợ một biểu diễn số duy nhất cho mỗi một ký kết tự, nhưng không cần xem xét nền tảng, công tác hay ngôn từ là gì. Chuẩn chỉnh Unicode (Unicode Standard) cung ứng một phương thức đồng nhất để mã hóa toàn cục ngôn ngữ viết trên nạm giới. Để mã ký kết tự trông đơn giản và dễ dàng và hiệu quả, nó đã gán một ký tự với một trong những duy nhất. Chuẩn Unicode hỗ trợ 3 vẻ ngoài mã hóa như mình đã nói sinh hoạt trên, bao hàm UTF-8, UTF-16 với UTF-32, mã hóa cùng một cỗ ký tự, dĩ nhiên.

*

Bảng mã Unicode

Vậy thì Unicode thực thụ là gì? Unicode là một trong những bảng mã, nó ánh xạ một trong những duy nhất mang đến một ký kết tự (ký tự này rất có thể là vần âm tiếng Anh như "a", "b" hoặc giờ Việt "á", "ớ", giờ đồng hồ Nhật hoặc là những ký tự quan trọng đặc biệt như "$", "%", dấu chấm câu ".", ","...)

Mỗi số do vậy được gọi là một trong điểm mã (code point), một khái niệm mang ý nghĩa lý thuyết. Còn vấn đề điểm mã được màn trình diễn trong bộ nhớ lưu trữ hay ổ đĩa là một câu chuyện trọn vẹn khác. Mỗi điểm mã được trình diễn dưới dạng U+0639. "U+" tượng trưng mang lại "Unicode", còn phần thông số là hệ hexa. Ví dụ, điểm mã U+0041 là số hexa 0041 (tương đương số thập phân 65). Nó trình diễn ký tự "A" trong chuẩn Unicode.

Mỗi cam kết tự được gán một tên độc nhất để rõ ràng nó với cam kết tự khác. Chẳng hạn, U+0041 được gán tên là "LATIN CAPITAL LETTER A". U+0A1B được gán với thương hiệu "GURMUKHI LETTER CHA".

Lấy lấy ví dụ một xâu cam kết tự:

Hellotrong Unicode, xâu ký kết tự này khớp ứng với 5 điểm mã (lưu ý là 5 điểm mã chứ chưa hẳn 5 byte)

U+0048 U+0065 U+006C U+006C U+006FSố vần âm mà Unicode hoàn toàn có thể định nghĩa là không giới hạn, trên thực tế nó vượt xa số lượng 65536. Phiên bản Unicode tiên tiến nhất là 9.0.0, trình diễn tổng số 128172 ký tự.

Một số thuật ngữ hay được sử dụng trong Unicode như: không gian mã (code space), plane, code unit, block...

Không gian mã là không gian chứa toàn bộ các điểm mã của Unicode. Một thuật ngữ khác là plane. Unicode phân thành 17 plane, mỗi plane chứa 65,536 ký tự (tương đương 16 bit), bởi vậy tổng kích thước không khí mã của Unicode là 17 × 65,536 = 1,114,112. Bây giờ với phiên bạn dạng Unicode 9.0 mình đã đề cập nghỉ ngơi trên thì chỉ sử dụng chưa đến 10% không khí mã. Một vấn đề cần nói thêm là Unicode sẽ tiêu giảm chỉ với 17 plane, tức là sẽ không xẩy ra việc buộc phải tới plane lắp thêm 18 để biểu diễn ký tự, không khí mã với trên 1 triệu cam kết tự có thể được mã hóa đã quá đầy đủ cho phương châm của Unicode, bởi vì vậy mà chuẩn Unicode không tồn tại ý định mở rộng thêm không gian mã đến plane trang bị 18 hoặc hơn.

Xem thêm: Hướng Dẫn Cách Xóa Font Chữ Trong Win 10 Làm Mới Diện Mạo Hệ Thống

Để gọi hơn về plane, rất nhiều người có thể xem lại định dạng điểm mã Unicode U+0639. Như thuở đầu mình sẽ nói thì chuẩn Unicode mã hóa cam kết tự vào dải tự U+0000 đến U+10FFFF. Mỗi plane sẽ áp dụng 65536 cam kết tự, tương đương từ 0000 - FFFF trong hệ hexa. 17 plane, tức tương đương đánh số sản phẩm công nghệ tự trường đoản cú 0 cho 16 vào hệ thập phân, tức là 00-10 vào hệ hexa, 2 số này sẽ chiếm 2 vị trí đầu tiên trong định hình 6 số (hhhhhh).

Chung quy lại format điểm mã Unicode gồm dạng U+000639, cùng với "U+" là Unicode, 2 số đầu để diễn tả plane, 4 số cuối là điểm mã vào plane đó. Plane thứ nhất gọi là Basic Multilingual Plane, đây là plane đặc trưng nhất (plane 0), đựng gần như đa số hệ thống chữ viết và ký hiệu thường được sử dụng trên nỗ lực giới. Chứa ký tự nằm trong khoảng U+0000 mang lại U+FFFF.

Đơn vị mã (code unit), thuật ngữ đó lại liên quan đến cách tiến hành mã hóa. Ví dụ điển hình với UTF-8 thì code unit là 1 byte, UTF-16 thì code unit là 2 byte, trong những lúc UTF-32 là 4 byte.

Blocks: chỉ dễ dàng và đơn giản là một dải những điểm mã mà có một điểm lưu ý chung nào đấy, về mặt ngôn ngữ hoặc chức năng.Chẳng hạn block đầu tiên, từ U+0000 cho U+001F là dải mã để biểu diễn các ký tự điều khiển và tinh chỉnh (control character), gồm 32 cam kết tự. Block tiếp sau tên là Basic Latin, bắt đầu từ U+0020 mang lại U+007F, đây cũng đó là dải mã biểu diễn các ký tự vào bảng mã ASCII...

Tiếng Việt của chính bản thân mình thì dùng những ký tự vào block Basic Latin, để biểu diễn những ký tự không dấu, như "a", "A". Còn các ký tự bao gồm dấu như "á", "ấ", "Ớ" thì nằm trong block Latin-1 Supplement, Latin Extended-B cùng Latin Extended Additional.Thông tin về những Unicode block các bạn cũng có thể tra cứu vãn ở đây.

http://unicode-table.com/en/

Các thủ tục mã hóa Unicode (Encoding)

Phương thức dịch điểm mã thanh lịch nhị phân được điện thoại tư vấn là mã hóa ký kết tự (character encoding). Như đang nói, Unicode có 3 thủ tục mã hóa: UTF-8, UTF-16 cùng UTF-32

UTF-32: đó là phương thức mã hóa Unicode dễ dàng và đơn giản nhất. Từng điểm mã được màn biểu diễn trực tiếp bằng một đơn vị chức năng mã 32 bit

UTF-16: trong phong cách mã hóa này, mỗi điểm mã vào plane 0 (U+0000 đến U+FFFF) được màn biểu diễn bằng một đơn vị chức năng mã 16 bit, các điểm mã tự plane 1 trở đi phải dùng một cặp đơn vị mã 16 bit để biểu diễn.

UTF-8: tương tự như UTF-32 với UTF-16, mẫu mã mã hóa này sử dụng đơn vị chức năng mã 8 bit, và nó có thể biểu diễn được số đông ký tự vào dải U+0000 cho U+10FFFF, điểm khác biệt duy độc nhất vô nhị với 2 hình dạng mã hóa bên trên là UTF-8 tương thích với ASCII.

Trong nội dung bài viết này mình sẽ trình diễn kỹ về UTF-8, cách làm mã hóa được sử dụng phổ biến nhất hiện nay nay. Gọi được phương pháp UTF-8 mã hóa đang giúp chúng ta có mẫu nhìn toàn diện hơn về vấn đề mã hóa ký tự. Một số ưu điểm của nó:

UTF-8 rất có thể biểu diễn được đều điểm mã UnicodeNó tương hợp của ASCIINó ngày tiết kiệm không gian hơn so với hồ hết kiểu mã hóa bạn bè của nó như UTF-16 hay UTF-32. Cam kết tự mã hóa theo kiểu UTF-8 có thể nằm trong tầm từ 1-4 byte. Cùng với văn bản tiếng Anh thông thường thì chỉ việc sử dụng 1-2 byte để màn trình diễn một ký tự.UTF-8 không yêu cầu thực hiện BOM (byte order mark)

Để đích thực hiểu cách UTF-8 encoding làm việc, bạn có thể xem bảng sau, cầm tắt về cách thức mã hóa như sau:

*

Với ký tự chỉ có 1 byte (hầu hết là ASCII), bit đầu tiên sẽ luôn là 0 để tương hợp với ASCIIVới ký tự multi-byte, byte trước tiên sẽ bước đầu với tự 2-4 hàng đầu để trình diễn số byte cam kết tự vẫn dùng, theo sau là một số 0Phần bit còn lại trong byte trước tiên và phần lớn byte tiếp sau được dùng để làm điền đều bit biểu diễn điểm mã, nước ngoài trừ việc mỗi byte tiếp theo sau sẽ ban đầu với 10

Từ ví dụ như U+00A3 bọn họ lấy quý giá thập phân của A3 là 163 và đưa sang hệ nhị phân, sẽ là 10100011. Chú ý rằng phải 8 số nhị phân để trình diễn số này trong hệ nhị phân. Trong khi đó ví như là single-byte thì luôn luôn phải ban đầu bằng 0 để tương xứng với ASCII, thế cho nên để biểu diễn ký tự gồm điểm mã là U+00A3 họ cần 2 byte.

Vì là cam kết từ multi-byte yêu cầu byte đầu tiên sẽ bắt đầu bằng hai tiên phong hàng đầu để chỉ ra rằng rằng tất cả hai byte rất cần phải sử dụng, theo sau là một vài 0, sau đó là các bit của điểm mã họ cần điền. Hôm nay byte thứ nhất sẽ bao gồm dạng là 110xxxxx

Thêm vào kia ở mục 3 mình bao gồm đề cập là hầu như byte sau byte thứ nhất luôn được bước đầu với 10. Bởi vậy cùng với 3 bit thứ nhất của byte trước tiên là 110, 2 bit đầu tiên của byte máy hai là 10, họ đã dùng 5 bit để sử dụng cho định dạng vẻ bên ngoài mã hóa, từ bây giờ chỉ sót lại 11 bit để đậy đầy bởi điểm mã. Vì chưng giá trị nhị phân của U+00A3 là 10100011, chỉ gồm 8 bit, ta mặc định thêm 3 số 0 vào đầu nữa cho đủ 11 bit, thành 00010100011, từ giá trị này bọn họ chỉ việc lấp vào số bit còn thừa đã tính sống trên, giảm từ trái sang phải.Như vậy byte trước tiên sẽ là

11000010

byte tiếp sau sẽ là

10100011

https://en.wikipedia.org/wiki/UTF-8#Examples

Ứng dụng

Vậy là hiện nay chắc chúng ta cũng đã hiểu được phần làm sao về Unicode và kiểu mã hóa UTF-8 rồi. Hãy thử vấn đáp mấy câu hỏi sau coi sao nhé (à bên trên editor nhớ cất giữ với encoding là UTF-8 nhé) =))

$str_jp = "た"; $str_vn_1 = "á"; $str_vn_2 = "ớ"; 1. Strlen($str_jp) 2. Mb_strlen($str_jp, "UTF-8"); 3. $str_jp<0>; 4. $str_jp<0> . $str_jp<1> . $str_jp<2>; 5. Strlen($str_vn_1); 6. Strlen($str_vn_2);Đáp án đang là

1. 3 2. 1 3. � 4. わ 5. 2 6. 3Câu lần đầu tiên và thứ 2 thì đơn giản rồi, strlen đo chiều dài xâu cam kết tự dựa trên số byte, còn mb_strlen đo chiều dài dựa vào encoding, cỗ ký tự giờ Nhật mã hóa theo UTF-8 thì nên dùng 3 byte, cần strlen trả về 3, còn mb_strlen trả về 1.

Xem thêm: Cuộc Trò Chuyện Bí Mật Trên Messenger Mà Bạn Nên Biết, Cách Tạo Tin Nhắn Bí Mật Trên Messenger

Vì vẻ bên ngoài $str đã trả về byte tại vị trí index, đề xuất đương nhiên hiệu quả sẽ lỗi, bởi vì trình duyệt cũng giống như bộ lời giải không hiểu đấy là cái gì, vì nếu chuyển sang hệ nhị phân thì nó là 11100011, không trùng với bất cứ ký tự như thế nào (facepalm)

Ở câu 4, đơn giản dễ dàng chỉ là nối 3 byte lại với nhau, Unicode sẽ dựa vào byte đầu tiên, cũng chính là 11100011, nó sẽ biết rằng đấy là byte format cho cam kết tự, 3 số 1 chứng minh ký từ bỏ này yêu cầu 3 byte nhằm biểu diễn, thế nên nó chỉ việc tìm và đào bới thêm 2 byte tiếp sau là sẽ hiểu rằng đó là ký kết tự gì. Do định dạng của 2 byte sau phần đông là 10xxxxxx, bạn có thể thử tráo vị trị 2 byte này, đã ra được một ký tự khác mà không còn xảy ra lỗi, theo ví dụ trên thì nếu

$str_jp<0> . $str_jp<2> . $str_jp<1>sẽ cho output là

㏂ký tự này còn có điểm cơ mà Unicode là U+33C2 (có vẻ không tương quan lắm) =))

Câu đồ vật 5 cùng thứ 6, có lẽ bạn cảm thấy hơi lạ, do cùng là ký tự tiếng Việt mà lại có độ dài byte không giống nhau, tại sao là vì chưng tiếng Việt mình áp dụng ký từ thuộc các block khác nhau, gồm ở cả Basic Latin (vốn là ASCII, buộc phải chỉ có 1 byte), rồi Latin-1 Supplement, Latin Extended-B cùng Latin Extended Additional, phải nó hoàn toàn có thể có độ dài từ là 1 đến 3 byte, và kết quả strlen cũng biến đổi tùy theo ký kết tự ấy áp dụng bao nhiêu byte.

Vậy là xong, ao ước rằng qua bài viết này thì bạn cũng có thể có cái nhìn rõ hơn về Unicode và xử lý ký tự bất kể là single-byte hay multi-byte.Thank you for reading!