Unicode là gì

     

Nếu câu vấn đáp bạn chọn là Đúng, xin chúc mừng, các bạn đã sai, đừng bi ai vì ít ra bạn đã có một bằng hữu là bản thân =))

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

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

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

Trước khi Unicode ra đời, quả đât đã tồn tại hàng ngàn hệ mã hóa, tuy nhiên lại không có ngẫu nhiên hệ nào lưu trữ được không thiếu mọi ký tự. Khá nổi bật nhất chắc chắc rằng là ASCII, bảng mã dựa trên chữ loại Latin được sử dụng trong giờ đồng hồ Anh hiện tại đại.

Chính xác thì ASCII cần sử dụng 7 bit màn biểu diễn với 7 số nhị phân (thập phân từ 0 mang đến 127). Từ 32 đến 127 là hầu như ký từ in được, có nghĩa là hiển thị được, lấy ví dụ như " " là 32, chữ cái "A" là 65. Mã dưới 32 được dùng để biểu diễn ký tự tinh chỉnh (control character), ví như nút ESC, Backspace.

Rõ ràng chỉ với 7, thậm chi là 8 bit, các bạn chỉ biểu diễn được về tối đa 256 cam kết tự, từng đó quá đầy đủ với tiếng Anh, nhưng với ngôn ngữ khác thì không thể. Vậy các hệ mã hóa không giống thì sao? hồ hết hệ mã hóa đó lại xung hốt nhiên với nhau. Lấy một ví dụ cả hai đều cùng sử dụng một số để biểu diễn hai ký kết tự khác biệt, hoặc lại cần sử dụng hai số khác biệt để trình diễn cùng một ký kết tự. Từng một máy tính đều hỗ trợ nhiều chuẩn mã hóa, cũng chính vì vậy mà mỗi khi dữ liệu được dàn xếp 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 ra đời để xử lý vấn đề này. Nó cung ứng một biểu diễn số duy nhất cho mỗi một ký tự, mà không cần lưu ý đến nền tảng, lịch trình hay ngôn từ là gì. Chuẩn chỉnh Unicode (Unicode Standard) cung ứng một phương thức đồng bộ để mã hóa toàn cục ngôn ngữ viết trên ráng giới. Để mã ký tự trông dễ dàng và hiệu quả, nó đã gán một ký tự với một số duy nhất. Chuẩn chỉnh Unicode cung cấp 3 vẻ ngoài mã hóa như tôi đã nói làm việc trên, bao hàm UTF-8, UTF-16 và UTF-32, mã hóa cùng một bộ ký tự, dĩ nhiên.

*

Bảng mã Unicode

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

Mỗi số do vậy được gọi là 1 trong những điểm mã (code point), một khái niệm mang tính lý thuyết. Còn câu hỏi điểm mã được màn trình diễn trong bộ nhớ lưu trữ hay ổ đĩa là một trong câu chuyện hoàn toàn khác. Từng điểm mã được màn trình diễn dưới dạng U+0639. "U+" tượng trưng đến "Unicode", còn phần hệ 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ó màn biểu diễn ký từ "A" trong chuẩn chỉnh Unicode.

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

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

Hellotrong Unicode, xâu ký tự này tương ứ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ố chữ cái mà Unicode rất có thể định nghĩa là ko giới hạn, trên thực tế nó thừa xa số lượng 65536. Phiên bạn dạng Unicode tiên tiến nhất là 9.0.0, trình diễn tổng số 128172 ký kết tự.

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

Không gian mã là không khí chứa tất cả các điểm mã của Unicode. Một thuật ngữ khác là plane. Unicode tạo thành 17 plane, mỗi plane cất 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. Lúc này với phiên bản Unicode 9.0 tôi đã đề cập nghỉ ngơi trên thì chỉ sử dụng không tới 10% không khí mã. Một vấn đề cần nói thêm là Unicode sẽ hạn chế chỉ cùng với 17 plane, có nghĩa là sẽ không xảy ra việc bắt buộc tới plane trang bị 18 để biểu diễn ký tự, không gian mã với trên 1 triệu ký tự có thể được mã hóa vẫn quá đủ cho mục tiêu của Unicode, chính vì vậy mà chuẩn Unicode không tồn tại ý định mở rộng thêm không khí mã cho plane trang bị 18 hoặc hơn.

Xem thêm: Cba Là Gì ? Ưu Nhược Điểm Của Cba Ưu Nhược Điểm Của Cba

Để phát âm hơn về plane, hầu hết người có thể xem lại định dạng điểm mã Unicode U+0639. Như ban đầu mình đã nói thì chuẩn Unicode mã hóa ký kết tự vào dải từ U+0000 mang lại U+10FFFF. Từng plane sẽ áp dụng 65536 ký kết tự, tương đương từ 0000 - FFFF trong hệ hexa. 17 plane, tức tương tự đánh số sản phẩm tự từ 0 cho 16 trong hệ thập phân, tức là 00-10 vào hệ hexa, 2 số này sẽ chỉ chiếm 2 vị trí trước tiên trong định hình 6 số (hhhhhh).

Chung quy lại định dạng điểm mã Unicode tất cả dạng U+000639, 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 quan trọng nhất (plane 0), cất gần như đa số hệ thống chữ viết và ký hiệu hay được sử dụng trên rứa giới. Chứa cam kết tự nằm trong khoảng U+0000 mang lại U+FFFF.

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

Blocks: chỉ dễ dàng và đơn giản là một dải các điểm mã mà gồm một đặc điểm chung như thế nào đấy, về mặt ngữ điệu hoặc chức năng.Chẳng hạn block đầu tiên, từ U+0000 cho U+001F là dải mã nhằm biểu diễn những ký tự tinh chỉnh và điều khiển (control character), có 32 ký kết tự. Block tiếp sau tên là Basic Latin, bắt đầu từ U+0020 cho U+007F, trên đây cũng chính 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 các ký tự trong block Basic Latin, nhằm biểu diễn các ký tự không dấu, như "a", "A". Còn những ký tự tất cả dấu như "á", "ấ", "Ớ" thì phía trong block Latin-1 Supplement, Latin Extended-B cùng Latin Extended Additional.Thông tin về những Unicode block các chúng ta cũng có thể tra cứu vớt ở đây.

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

Các cách thức mã hóa Unicode (Encoding)

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

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

UTF-16: trong hình trạng mã hóa này, từng điểm mã trong 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, những điểm mã tự plane 1 trở đi nên dùng một cặp đơn vị mã 16 bit để biểu diễn.

UTF-8: tương tự như UTF-32 và UTF-16, thứ hạng mã hóa này sử dụng đơn vị mã 8 bit, cùng nó hoàn toàn có thể biểu diễn được mọi ký tự trong dải U+0000 đến U+10FFFF, điểm khác biệt duy duy nhất với 2 dạng hình mã hóa trên là UTF-8 tương hợp với ASCII.

Trong bài viết này bản thân sẽ trình bày kỹ về UTF-8, phương thức mã hóa được sử dụng thịnh hành nhất hiện nay nay. Hiểu được biện pháp UTF-8 mã hóa đã giúp họ có mẫu nhìn toàn vẹn hơn về câu hỏi mã hóa ký kết tự. Một số điểm mạnh của nó:

UTF-8 hoàn toàn có thể biểu diễn được đa số điểm mã UnicodeNó tương xứng của ASCIINó huyết kiệm không gian hơn so với hầu hết kiểu mã hóa anh em của nó như UTF-16 tốt UTF-32. Ký kết tự mã hóa theo phong cách UTF-8 hoàn toàn có thể nằm trong tầm từ 1-4 byte. Với văn phiên bản tiếng Anh thường thì thì chỉ việc sử dụng 1-2 byte để trình diễn một ký tự.UTF-8 ko yêu cầu áp dụng BOM (byte order mark)

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

*

Với ký tự chỉ có một byte (hầu không còn là ASCII), bit thứ nhất sẽ luôn là 0 để tương hợp với ASCIIVới ký tự multi-byte, byte thứ nhất sẽ ban đầu với từ bỏ 2-4 tiên phong hàng đầu để trình diễn số byte ký tự đang dùng, theo sau là một vài 0Phần bit sót lại trong byte thứ nhất và đầy đủ byte tiếp sau được dùng để làm điền đầy đủ bit biểu diễn điểm mã, ngoại trừ bài toán mỗi byte tiếp sau sẽ bắt đầu với 10

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

Vì là ký từ multi-byte đề xuất byte thứ nhất sẽ bước đầu bằng hai tiên phong hàng đầu để đã cho thấy rằng bao gồm hai byte rất cần được sử dụng, theo sau là một số trong những 0, tiếp đến là những bit của điểm mã chúng ta cần điền. Bây giờ byte đầu tiên sẽ tất cả dạng là 110xxxxx

Thêm vào kia ở mục 3 mình tất cả đề cập là rất nhiều byte sau byte đầu tiên luôn được bắt đầu với 10. Vày vậy với 3 bit đầu tiên của byte trước tiên là 110, 2 bit đầu tiên của byte đồ vật hai là 10, chúng ta đã cần sử dụng 5 bit để áp dụng cho định dạng vẻ bên ngoài mã hóa, hôm nay chỉ còn sót lại 11 bit để tủ đầy bởi điểm mã. Vì chưng giá trị nhị phân của U+00A3 là 10100011, chỉ bao gồm 8 bit, ta khoác định thêm 3 số 0 vào đầu nữa cho vừa khéo 11 bit, thành 00010100011, từ giá trị này họ chỉ câu hỏi lấp vào số bit còn thừa đã tính nghỉ ngơi trên, giảm từ trái lịch sự phải.Như vậy byte đầu 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à bây giờ chắc chúng ta cũng vẫn hiểu được phần làm sao về Unicode với kiểu mã hóa UTF-8 rồi. Hãy thử trả lời mấy thắc mắc sau xem 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 thứ nhất và thứ hai thì đơn giản rồi, strlen đo chiều lâu năm xâu cam kết tự dựa trên số byte, còn mb_strlen đo chiều dài dựa trên encoding, bộ ký tự giờ đồng hồ Nhật mã hóa theo UTF-8 thì nên cần dùng 3 byte, nên strlen trả về 3, còn mb_strlen trả về 1.

Xem thêm: Cách Làm Bò Bóp Thấu Chua Ngọt, Đậm Đà, Cách Làm Gỏi Bò Bóp Thấu Đậm Đà, Chuẩn Vị

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

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

$str_jp<0> . $str_jp<2> . $str_jp<1>sẽ mang đến output là

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

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

Vậy là xong, hy vọng rằng qua nội dung bài viết này thì bạn cũng đều có cái nhìn được rõ hơn về Unicode và giải pháp xử lý ký tự bất cứ là single-byte tốt multi-byte.Thank you for reading!