Cơ sở của những điều cơ bản là mã hóa ASCII và các cách diễn giải hiện đại của nó. Các khái niệm cơ bản về mã hóa và giải mã. Các khái niệm cơ bản về mã hóa và giải mã

Bất kỳ số nào (trong giới hạn nhất định) trong bộ nhớ máy tính đều được mã hóa dưới dạng số hệ thống nhị phân Tính toán Đối với điều này có đơn giản và quy tắc rõ ràng dịch. Tuy nhiên, ngày nay máy tính được sử dụng rộng rãi hơn nhiều so với vai trò thực hiện các phép tính tốn nhiều công sức. Ví dụ, thông tin văn bản và đa phương tiện được lưu trữ trong bộ nhớ máy tính. Vì vậy câu hỏi đầu tiên được đặt ra:

Các ký tự (chữ cái) được lưu trữ trong bộ nhớ máy tính như thế nào?

Mỗi chữ cái thuộc một bảng chữ cái cụ thể trong đó các ký hiệu nối tiếp nhau và do đó có thể được đánh số bằng các số nguyên liên tiếp. Mỗi chữ cái có thể được liên kết với một số nguyên dương và được gọi là mã ký tự của nó. Chính mã số này sẽ được lưu trữ trong bộ nhớ của máy tính và khi hiển thị ra màn hình hoặc tờ giấy sẽ được “chuyển đổi” thành ký hiệu tương ứng. Để phân biệt cách biểu diễn số với cách biểu diễn ký hiệu trong bộ nhớ máy tính, cũng cần lưu trữ thông tin về dữ liệu nào được mã hóa trong đó. khu vực cụ thể ký ức.

Sự tương ứng của các chữ cái trong một bảng chữ cái nhất định với mã số tạo thành cái gọi là bảng mã hóa. Nói cách khác, mỗi ký tự của một bảng chữ cái cụ thể đều có ký tự riêng mã số theo quy định nhất định bảng mã hóa.

Tuy nhiên, trên thế giới có rất nhiều bảng chữ cái (tiếng Anh, tiếng Nga, tiếng Trung, v.v.). Vậy câu hỏi tiếp theo là:

Làm cách nào để mã hóa tất cả các bảng chữ cái được sử dụng trên máy tính?

Để trả lời câu hỏi này, chúng ta hãy đi theo con đường lịch sử.

Vào những năm 60 của thế kỷ 20 ở Mỹ viện quốc gia tiêu chuẩn hóa (ANSI), một bảng mã hóa ký tự đã được phát triển, sau đó được sử dụng trong tất cả các hệ điều hành. Bảng này được gọi là ASCII ( Tiêu chuẩn Mỹ Mã số để biết thông tin Trao đổi – Mỹ mã chuẩnđể trao đổi thông tin). Một lát sau, một phiên bản mở rộng của ASCII xuất hiện.

Theo bảng mã hóa ASCII 1 byte (8 bit) được phân bổ để thể hiện một ký tự. Một tập hợp 8 ô có thể nhận 28 = 256 giá trị khác nhau. 128 giá trị đầu tiên (từ 0 đến 127) là hằng số và tạo thành cái gọi là phần chính của bảng, bao gồm các số thập phân, các chữ cái trong bảng chữ cái Latinh (chữ hoa và chữ thường), dấu chấm câu (dấu chấm, dấu phẩy, dấu ngoặc đơn) , v.v.), cũng như các khoảng trắng và các ký tự dịch vụ khác nhau (tab, nguồn cấp dữ liệu dòng, v.v.). Các giá trị từ 128 đến 255 tạo thành một phần bổ sung của bảng, nơi người ta thường mã hóa các ký tự từ bảng chữ cái quốc gia.

Vì có rất nhiều bảng chữ cái quốc gia nên các bảng ASCII mở rộng có nhiều biến thể. Ngay cả đối với tiếng Nga, cũng có một số bảng mã hóa (Windows-1251 và Koi8-r là phổ biến). Tất cả điều này tạo thêm khó khăn. Ví dụ: chúng tôi gửi một lá thư được viết bằng một bảng mã và người nhận cố gắng đọc nó bằng một bảng mã khác. Kết quả là anh ta nhìn thấy krakozyabry. Vì vậy, người đọc cần áp dụng bảng mã hóa khác cho văn bản.

Có một vấn đề khác. Bảng chữ cái của một số ngôn ngữ có quá nhiều ký tự để vừa với các vị trí được chỉ định từ 128 đến 255 trong bộ ký tự một byte.

Vấn đề thứ ba là phải làm gì nếu văn bản sử dụng nhiều ngôn ngữ (ví dụ: tiếng Nga, tiếng Anh và tiếng Pháp)? Bạn không thể sử dụng hai bảng cùng một lúc...

Để giải quyết những vấn đề này cùng một lúc, Unicode đã được phát triển.

Chuẩn mã hóa ký tự Unicode

Để giải quyết các vấn đề trên, một chuẩn mã hóa ký tự đã được phát triển vào đầu những năm 90, gọi là bảng mã Unicode. Tiêu chuẩn này cho phép bạn sử dụng hầu hết mọi ngôn ngữ và ký hiệu trong văn bản.

Unicode cung cấp 31 bit (4 byte trừ một bit) để mã hóa ký tự. Số lượng kết hợp có thể mang lại một con số đáng kinh ngạc: 231 = 2.147.483.684 (tức là hơn hai tỷ). Vì vậy, Unicode mô tả bảng chữ cái của tất cả ngôn ngữ đã biết, ngay cả những ký hiệu “đã chết” và hư cấu, bao gồm nhiều ký hiệu toán học và ký hiệu đặc biệt khác. Tuy nhiên, dung lượng thông tin của Unicode 31-bit vẫn còn quá lớn. Do đó, phiên bản 16 bit rút gọn (216 = 65.536 giá trị) thường được sử dụng hơn, trong đó tất cả các bảng chữ cái hiện đại đều được mã hóa.

Trong Unicode, 128 mã đầu tiên giống với bảng ASCII.

Chúc một ngày tốt lành cho tất cả. Alexey Gulynin đang liên lạc. Trong bài viết trước chúng ta đã xem xét tạo bảng trong html. Trong bài viết này tôi muốn nói về một vấn đề mà bạn chắc chắn sẽ gặp phải (nếu bạn chưa gặp phải) trong quá trình luyện tập của mình. Và vấn đề này liên quan đến mã hóa trên trang web. Tình huống này thường xảy ra: bạn ngồi, nghĩ ra điều gì đó và cuối cùng suy nghĩ của bạn được thể hiện bằng văn bản. Bạn mở tác phẩm của mình trong trình duyệt và có toàn những điều vô nghĩa được viết ở đó, hoặc như người ta thường gọi điều này là vô nghĩa - “krakozyabry”. Một điều hiển nhiên ở đây là vấn đề với mã hóa trên trang web. Rất có thể mã hóa mặc định của bạn là windows-1251 (chữ Cyrillic) và trình duyệt đang cố mở tệp của bạn ở dạng mã hóa utf-8. Nói ngắn gọn về mã hóa là gì. Mã hóa là một loại bảng gán cho mỗi ký tự một ký tự nhất định mã máy. Theo đó, các chữ cái tiếng Nga của chúng tôi trong một bảng mã có một mã, ở các bảng mã khác - một mã khác. Các bạn, hãy sử dụng mã hóa utf-8 ở mọi nơi và bạn sẽ hài lòng. Utf-8 còn được gọi là Unicode.

Hãy tạo một tài liệu thử nghiệm trong Notepad++ và viết đoạn mã sau.

Sự cố mã hóa

Kiểm tra vấn đề mã hóa

Trong menu Notepad++, đảm bảo rằng "Mã hóa" ở trên cùng - "Mã hóa trong ANSI". Bây giờ chúng ta sẽ tạo ra một vấn đề về mã hóa một cách giả tạo. Hãy thử mở tệp này trong trình duyệt của bạn ngay bây giờ. Chúng ta sẽ thấy chữ tượng hình. Vấn đề ở đây là chúng tôi đã tạo tệp của mình trong mã hóa ANSI(Cyrillic) và trình duyệt được thông báo rằng tệp của chúng tôi đã được mã hóa utf-8 ( ) .

Những lý do tại sao vấn đề với mã hóa trên trang web:

1) Giá trị không chính xác thuộc tính bộ ký tự của thẻ meta.

2) Trong menu Notepad++, kiểm tra xem mã hóa tệp có phải là utf-8 không. Việc này cần được thực hiện “Mã hóa” - “Mã hóa theo UTF-8 (không có BOM)”. Trên Internet, bạn có thể tìm thấy định nghĩa “BOM” là gì, nhưng không rõ ràng. Theo tôi hiểu, ở phần đầu của tài liệu có viết không gian không phá vỡ với chiều rộng bằng không. Chúng ta không cần nó nên luôn để "không có BOM".

3) Đôi khi hai điểm đầu tiên đã được hoàn thành, nhưng những điều vô nghĩa vẫn xuất hiện trên các trang của trang web. Ở đây vấn đề có thể nằm ở cài đặt máy chủ, tức là. hosting trực tiếp chuyển tiêu đề cho các tệp của chúng tôi và đặt mã hóa mặc định. Chúng ta hãy cố gắng cai sữa cho anh ấy khỏi việc này. Cần có tệp .htaccess trong thư mục gốc của trang web. Sử dụng tệp này, bạn có thể điều chỉnh hoạt động lưu trữ. Nếu bạn không có tập tin này, thì bạn cần phải tạo nó. Thật thuận tiện để làm điều này trong Trình soạn thảo sổ tay++. TRONG tập tin này bạn cần phải viết đoạn mã sau:

AddDefaultCharset UTF-8

Với hướng dẫn này, chúng tôi thông báo cho máy chủ rằng mã hóa mặc định của chúng tôi là "utf-8". Nếu điều này không giúp ích được gì thì bạn cần viết đoạn mã sau vào cùng một tệp:

Charsetdisable trên AddDefaultCharset Tắt

Ở đây chúng tôi đang cố gắng thông báo với máy chủ rằng chúng tôi không muốn mã hóa mặc định. Nếu sau những âm mưu này không giúp được gì, thì bạn cần viết thư cho chủ nhà và quyết định vấn đề này với anh ấy. Có lẽ anh ấy sẽ nói với bạn điều gì đó.

Tạo biểu mẫu phản hồi

Về vấn đề mã hóa tập tin

Khi tạo biểu mẫu phản hồi, vấn đề mã hóa tệp thường phát sinh, đó là lý do tại sao thư đến Thư điện tử bao gồm các hình vuông, kim cương tuyệt vời và các "bánh quy giòn" khác.

Chúng ta hãy xem xét kỹ hơn về sự hiểu lầm rõ ràng này. Như các bạn đã biết, mã hóa (bộ ký tự) là phương pháp biểu diễn các ký tự để truyền đi. Suy cho cùng, bất kỳ thông tin nào lưu hành trong máy tính đều là một chuỗi số 0 và số 1. Mã hóa ký tự bao gồm một số byte, thường từ 1 đến 4. Có nhiều mã hóa và trình duyệt phải xác định chính xác mã nào trong số chúng mà trang web đang mở được viết.

Trong hầu hết các trường hợp trình duyệt hiện đạiđối phó thành công với nhiệm vụ này một cách độc lập. Tuy nhiên đối với định nghĩa đúng Thông thường, người ta thường đưa ra gợi ý trong mã HTML bằng cách sử dụng thẻ meta, ví dụ:
hoặc
.
.

Các nhà thiết kế web mới vào nghề đôi khi lầm tưởng rằng chỉ cần chèn thẻ meta mong muốn ở đầu trang là đủ - và mọi thứ sẽ ổn! Đó là một ảo tưởng. Như Kozma Prutkov đã viết một cách đúng đắn: “Nếu bạn nhìn thấy dòng chữ “Buffalo” trên chuồng voi, đừng tin vào mắt mình”. Điều cần thiết không chỉ là viết, chẳng hạn như charset=utf-8, mà còn phải đảm bảo rằng trang thực sự được thực hiện trong mã hóa được chỉ định.

Cách dễ nhất để tìm ra mã hóa thực tế của một trang là mở nó trong bất kỳ trình duyệt nào và chọn mục trong menu Xem - Mã hóa. Khi thay đổi mã hóa, hãy xác định xem mã nào trong số chúng sẽ hiển thị trang chính xác - đây sẽ là mã hóa thực sự của bạn. Chỉ ra nó trong thẻ meta. Nếu bạn muốn thay đổi mã hóa, thì để thực hiện việc này, bạn cần vào cài đặt của chương trình mà bạn tạo trang web và đặt mã hóa cần thiết. Ví dụ, trong chương trình Adobe DreamweaverĐể làm điều này bạn cần chọn một phần menu Chỉnh sửa - Cài đặt... - Tạo tài liệu - Mã hóa mặc định. Các mã hóa thường được sử dụng bộ ký tự=utf-8 hoặc bộ ký tự=windows-1251.

Bình luận: Nên đặt thẻ meta biểu thị mã hóa ở đầu mã HTML ngay sau thẻ để trình duyệt chọn đúng bảng mã trước khi hiển thị tiêu đề trang (thẻ ...), xuất hiện trên thanh màu xanh lam ở đầu cửa sổ trình duyệt. Ngược lại, thay vào đó chúng ta có thể thấy những hình vuông và viên kim cương tuyệt vời giống nhau.</p> </blockquote> <p>Các vấn đề hoàn toàn không cần thiết về mã hóa cũng phát sinh khi một trang web bao gồm một số tệp, chẳng hạn như chèn khung, tập lệnh <b>JavaScript</b> và như thế. Cần phải đảm bảo rằng tất cả các phần này được tạo ra trong cùng một mã hóa. Nhân tiện, chính trong trường hợp này là trong các chương trình email, chẳng hạn như trên mail.ru, thường có một số nút <a href="https://viws.ru/vi/kak-v-punto-switcher-sdelat-ruchnoe-pereklyuchenie-punto-switcher-programma.html">chuyển đổi thủ công</a> mã hóa, vì đôi khi rất khó để tự động xác định mã hóa mà một bức thư gửi đến thư được viết.</p> <p>Quay lại biểu mẫu phản hồi của chúng tôi, xin lưu ý rằng dữ liệu mã hóa tin nhắn có thể thay đổi trong quá trình chuyển tiếp. Đơn giản hóa, cơ chế gửi thư từ biểu mẫu tới E-mail của bạn trông như thế này. Đầu tiên, lá thư đạt đến giai đoạn trung gian <a href="https://viws.ru/vi/kak-ustanovit-na-kompyuter-pochtovyi-yashchik-kak-sozdat-sobstvennyi-pochtovyi-yashchik.html">Hộp thư</a> trên máy chủ lưu trữ của bạn và từ đó nó sẽ được gửi đến địa chỉ bạn đã chỉ định trong tệp PHP. Bạn có thể dễ dàng tìm thấy hộp trung gian này bằng cách xem trong bảng điều khiển trang web của bạn trong phần <b>Thư</b>. Toàn bộ quá trình này xảy ra dưới sự kiểm soát của chương trình PHP. Do đó, việc một lần nữa chỉ ra mã hóa chính xác cho tệp của bạn cũng rất hữu ích.</p> <p>Để làm điều này, bạn cần có trong tệp PHP (ở dạng của chúng tôi <a href="https://viws.ru/vi/bezbozhnyi-forma-svyazi-s-zadat-vopros-obratnaya-svyaz-uchites-zadavat-voprosy.html">nhận xét</a> Cái này <b>thư.php</b>) thêm dòng tiêu đề ( <b>tiêu đề</b>), dùng để xác định trong <a href="https://viws.ru/vi/nastroiki-pochtovyh-programm-dlya-ispolzovaniya-imap-servera-dlya-drugih.html">chương trình thư</a> một số <a href="https://viws.ru/vi/rezhim-zashchity-ot-sboev-windows-10-chto-vy-mozhete-delat-v-menyu-dopolnitelnye-parametry.html">thông số bổ sung</a> chữ cái: loại tài liệu <b>văn bản/đồng bằng</b>(văn bản thuần túy), địa chỉ người gửi, mã hóa, v.v. Trong trường hợp của chúng tôi, hãy thêm dòng tiêu đề sau ( <b>tiêu đề</b>) chỉ ra mã hóa: <br>$to = "pupkin@rambler.ru"; // Chèn địa chỉ của bạn vào đây <br>$headers = "Loại nội dung: văn bản/thuần túy; bộ ký tự=utf-8"; <br>$subject = "Thông báo từ trang web của bạn"; <br>$message = "Tên người gửi: $name \nĐịa chỉ email: $email \nMessage: $mess"; <br>$send = mail($to, $subject, $message, $headers);</p> <p>Bạn cũng nên thông báo cho trình duyệt về cách mã hóa chính xác bằng cách thêm tiêu đề có thẻ meta vào trang PHP để gửi biểu mẫu phản hồi (xem “Tạo biểu mẫu phản hồi”) <br> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />.</p> <p>Các vấn đề về mã hóa cũng phát sinh nếu bạn sử dụng tập lệnh trên trang để hiển thị bất kỳ văn bản nào, ví dụ: mã đánh dấu, ngày tháng, v.v. Để thay đổi mã hóa tập lệnh, bạn có thể sử dụng <b><a href="https://viws.ru/vi/illyustrirovannyi-samouchitel-po-word-chm-video-uroki-microsoft-word-dlya-nachinayushchih-ot.html">Phần mềm soạn thảo văn bản</a> </b>. Để thực hiện việc này, hãy mở tài liệu, đặt <a href="https://viws.ru/vi/mx-player-hw-dekoder-ne-podderzhivaetsya-zachem-mx-player-android-nuzhna-kodirovka-failov.html">mã hóa cần thiết</a>, nếu nó không xuất hiện chính xác (xem Trợ giúp Word để biết cách thực hiện việc này), thì hãy lưu nó như sau: <b>Tệp - Lưu dưới dạng - Văn bản thuần túy - Lưu</b>. Trong cửa sổ mở ra, bạn có thể đặt mã hóa cần thiết phù hợp với mã hóa trang của mình. <br></p> <p>Thật không may, những gì được mô tả <a href="https://viws.ru/vi/daite-nazvaniya-figuram-blok-shemy-sdelaite-svoyu-blok-shemu-prostoi-i.html">kỹ thuật đơn giản</a> việc chỉ định mã hóa không phải lúc nào cũng loại bỏ được lỗi khi xác định nó. Đôi khi cần phải can thiệp phẫu thuật lớn để vận hành máy PHP. <a href="https://viws.ru/vi/kak-vernutsya-k-pervomu-soobshcheniyu-v-dialoge-kak-naiti-nuzhnuyu.html">Thông tin cần thiết</a> Bạn có thể dễ dàng, nhưng nếu muốn, hãy tìm thông tin về các thao tác đó trong thư mục có tên “Internet” - con chuột nằm trong tay bạn!</p> <p><i>18/03/2011</i></p> <ul>Các bài viết khác về chủ đề “Tạo, tối ưu và quảng bá website”:</ul> <p>Nếu chuỗi bit trông không hợp lý (theo quan điểm của con người), thì đây là trường hợp tài liệu rất có thể bị chuyển đổi sai ở một thời điểm nào đó. Ví dụ: chúng tôi lấy văn bản ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ và không nghĩ ra điều gì tốt hơn, hãy lưu nó ở dạng UTF-8. Trình soạn thảo văn bản cho rằng nó đọc chính xác văn bản bằng mã hóa Mac Roman và bây giờ nó cần được lưu ở một mã hóa khác. Rốt cuộc, tất cả các ký tự này đều hợp lệ trong Unicode. Ý tôi là, Unicode có mệnh đề cho É, cho G, v.v. Vì vậy, chúng tôi chỉ lưu nó ở dạng UTF-8:</p><blockquote>11000011 10001001 01000111 11000011 10001001 11000011 10101100 11000011 10001001 01010010 11000011 10000101 01011011 11000011 10001001 01100110 11000011 10001001 01000010 11000011 10001001 11000011 10101100 11000011 10001001 01001111 11000011 10000111 11000011 10010101 11000011 10101100 11000011 10010100 11000011 10000111 11000010 10110101 11000011 10000111 11100010 10001001 10100000 11000011 10000111 11000010 10111011 11000011 10000111 11000010 10100010 <br></blockquote><br><p>Đây là cách văn bản ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ hiện được biểu diễn dưới dạng một chuỗi các bit UTF-8. Chuỗi bit này hoàn toàn khác với những gì có trong tài liệu gốc. Cho dù chúng ta sử dụng mã hóa nào để mở chuỗi này, chúng ta sẽ không bao giờ nhìn thấy <a href="https://viws.ru/vi/php-prostoi-dvizhok-s-autentifikaciei-http-ustanovka-zashchity-na-stranicu-ispolzuya-mysql.html">văn bản gốc</a>エンコーディングは難しくない. Anh ấy vừa mới bị lạc. Nó có thể được khôi phục nếu chúng tôi biết mã hóa Shift-JIS ban đầu và chúng tôi xử lý văn bản dưới dạng Mac Roman rồi lưu nó dưới dạng UTF-8. Nhưng những điều kỳ diệu như vậy rất hiếm.</p><p>Nhiều khi một chuỗi bit cụ thể không chính xác trong một mã hóa cụ thể. Nếu chúng ta cố mở tài liệu gốc ở dạng ASCII, chúng ta sẽ thấy rằng một số ký tự được nhận dạng, nhưng một số ký tự khác thì không. Chương trình bạn đang sử dụng có thể quyết định loại bỏ các byte không phù hợp với mã hóa hiện tại hoặc thay thế chúng bằng dấu chấm hỏi. Hoặc bằng ký tự thay thế Unicode đặc biệt: � (U+ FFFD). Nếu bạn lưu tài liệu sau quá trình xóa các ký tự không phù hợp, bạn sẽ mất chúng vĩnh viễn.</p><p>Nếu bạn đoán sai mã hóa rồi lưu nó vào một mã khác, bạn sẽ làm hỏng tài liệu. Bạn có thể cố gắng khắc phục nhưng những nỗ lực này thường không thành công. Phép thuật lệch bit thường vẫn là phép thuật bị hỏng: giống như thuốc đắp cho người chết.</p><h5>Và làm thế nào để thay đổi mã hóa một cách chính xác?</h5><p>Nó thực sự đơn giản! Bạn cần biết cách mã hóa một đoạn văn bản cụ thể (chuỗi bit) và sử dụng nó để giải mã nó. Thats tất cả để có nó. Nếu bạn đang viết một chương trình nhận văn bản từ người dùng, hãy xác định xem chương trình sẽ thực hiện việc này bằng cách mã hóa nào. Bất kỳ trường văn bản nào cũng phải biết nó chấp nhận dữ liệu ở dạng mã hóa nào. Đối với bất kỳ loại tệp nào mà người dùng có thể tải vào chương trình, phải xác định mã hóa. Hoặc nên có cách nào đó để hỏi người dùng về nó. Thông tin có thể được cung cấp bởi định dạng tệp hoặc người dùng (tất nhiên hầu hết trong số họ khó có thể biết cho đến khi họ đọc xong bài viết).</p><p>Nếu bạn cần chuyển đổi văn bản từ bảng mã này sang bảng mã khác, hãy sử dụng các công cụ đặc biệt. Chuyển đổi là công việc tẻ nhạt khi so sánh hai trang mã và quyết định rằng ký tự 152 trong mã hóa A giống với ký tự 4122 trong mã hóa B, sau đó thay đổi các bit. Không cần phải phát minh lại bánh xe: mọi ngôn ngữ lập trình phổ biến đều có các công cụ trừu tượng hóa bit và trang mã để chuyển đổi văn bản từ mã hóa sang mã hóa.</p><p>Giả sử ứng dụng của bạn cần chấp nhận các tệp ở GB18030, nhưng nội bộ bạn đang chạy ở UTF-32. Công cụ iconv có thể thực hiện chuyển đổi trong một dòng: iconv("GB18030", "UTF-32", $string). Các ký tự sẽ vẫn giữ nguyên mặc dù cách biểu diễn bit đã thay đổi.</p><blockquote>ký tự mã hóa GB18030 mã hóa UTF-32 <br>縧 10111111 01101100 00000000 00000000 01111110 00100111</blockquote><p>Đó là tất cả. Nội dung của chuỗi theo cách hiểu của con người không thay đổi nhưng giờ đây nó là chuỗi UTF-32 hợp lệ. Nếu bạn tiếp tục làm việc với nó trong UTF-32, bạn sẽ không gặp bất kỳ vấn đề nào với các ký tự không thể đọc được. Tuy nhiên, như chúng ta đã thảo luận trước đó, không phải tất cả các bảng mã đều có khả năng hiển thị tất cả các ký tự. Không thể mã hóa ký tự 縧 bằng bất kỳ bảng mã ngôn ngữ châu Âu nào. Và điều gì đó khủng khiếp có thể xảy ra.</p><h5>Mọi thứ đều ở dạng Unicode</h5><p>Đây là lý do tại sao không có lý do gì trong thế kỷ 21 không sử dụng Unicode. Một số bảng mã chuyên dụng cho các ngôn ngữ Châu Âu có thể có hiệu suất cao hơn Unicode cho <a href="https://viws.ru/vi/kak-udalit-ispolnennyi-zakaz-na-aliekspress-kak-udalit.html">ngôn ngữ cụ thể</a>. Nhưng miễn là bạn không phải làm việc với hàng terabyte văn bản đặc biệt (rất RẤT NHIỀU), bạn không phải lo lắng về điều đó. Các vấn đề phát sinh từ việc mã hóa không tương thích còn tệ hơn nhiều so với việc mất một gigabyte. Và lập luận này sẽ chỉ trở nên mạnh mẽ hơn khi việc lưu trữ dữ liệu và độ rộng kênh ngày càng tăng và trở nên rẻ hơn.</p><p>Nếu hệ thống cần hoạt động với các bảng mã khác, trước tiên hãy chuyển đổi văn bản sang Unicode và chuyển đổi lại nếu bạn cần xuất nó ở đâu đó. Nếu không, bạn sẽ phải theo dõi rất cẩn thận từng trường hợp truy cập dữ liệu và thực hiện các chuyển đổi cần thiết, nếu có thể mà không làm mất thông tin.</p><h5>Tai nạn hạnh phúc</h5><blockquote><i>Tôi đã có một trang web được kết nối với cơ sở dữ liệu. Ứng dụng của tôi xử lý mọi thứ dưới dạng UTF-8 và lưu trữ nó trong cơ sở dữ liệu như vậy, mọi thứ đều tuyệt vời, nhưng khi tôi vào khu vực quản trị cơ sở dữ liệu, tôi không thể hiểu được gì.</i><br>- lập trình viên lỗ mãng ẩn danh</blockquote><p>Các tình huống phát sinh khi mã hóa được xử lý không chính xác nhưng mọi thứ vẫn hoạt động tốt. Điều thường xảy ra là mã hóa cơ sở dữ liệu được đặt thành latin-1, nhưng ứng dụng hoạt động với UTF-8 (hoặc bất kỳ loại nào khác). Nói chung, mọi sự kết hợp giữa 1 và 0 đều hợp lệ trong tiếng Latin-1 byte đơn. Nếu cơ sở dữ liệu nhận được dữ liệu từ một ứng dụng như 11100111 10111000 10100111 thì nó sẽ vui vẻ lưu dữ liệu đó vì nghĩ rằng ứng dụng đó có nghĩa là 縧. Tại sao không? Sau đó, cơ sở dữ liệu trả về các bit tương tự cho ứng dụng, điều này rất vui vì nó đã nhận được ký tự UTF-8 縧 như dự kiến. Nhưng giao diện quản trị cơ sở dữ liệu biết rằng Latin-1 được sử dụng và đây là kết quả: không thể hiểu được gì. <br>Kẻ ngốc chỉ đơn giản là trúng xổ số, mặc dù các ngôi sao không đứng về phía anh ta. Mọi thao tác trên văn bản trong cơ sở dữ liệu đều có thể hoạt động nhưng có thể không được thực hiện như dự định do cơ sở dữ liệu không nhận biết chính xác văn bản. Trong trường hợp xấu nhất, cơ sở dữ liệu sẽ vô tình hủy toàn bộ văn bản, thực hiện thao tác tùy ý sau 2 năm cài đặt do mã hóa sai (và tất nhiên là không có bản sao lưu cho bạn).</p><h5>UTF-8 và ASCII</h5><p>Ưu điểm của UTF-8 là khả năng tương thích nhị phân của nó với ASCII, đây là cơ sở thực tế cho tất cả các bảng mã. Tất cả <a href="https://viws.ru/vi/ascii-dlya-statusa-vk-simvoly-oformlyaem-status-v-vk-krasivym-shriftom.html">ký tự ASCII</a> chiếm tối đa byte trong UTF-8 và sử dụng các bit giống như trong ASCII. Nói cách khác, ASCII có thể được ánh xạ 1:1 sang UTF-8. Bất kỳ ký tự không phải ASCII nào cũng chiếm 2 byte trở lên trong UTF-8. Hầu hết các ngôn ngữ lập trình sử dụng ASCII làm mã hóa mã nguồn đều cho phép đưa văn bản UTF-8 trực tiếp vào văn bản:</p><p>Lưu trong UTF-8 sẽ đưa ra chuỗi:</p><blockquote>00100100 01110011 01110100 01110010 01101001 01101110 01100111 00100000<br> 00111101 00100000 00100010 11100110 10111100 10100010 11100101 10101101<br> 10010111 00100010 00111011 </blockquote><p>Chỉ 12 byte trong số 17 byte (bắt đầu bằng 1) là ký tự UTF-8 (2 ký tự 3 byte). Các ký tự khác ở dạng ASCII. Trình phân tích cú pháp sẽ đọc như sau:</p><blockquote>$string = "11100110 10111100 10100010 11100101 10101101 10010111";</blockquote><p>Trình phân tích cú pháp xử lý mọi thứ đằng sau trích dẫn dưới dạng một chuỗi bit phải được xử lý nguyên trạng, cho đến tận trích dẫn khác. Nếu bạn chỉ xuất chuỗi này, bạn sẽ xuất văn bản ở dạng UTF-8. Bạn không cần phải làm gì khác. Trình phân tích cú pháp không cần hỗ trợ cụ thể utf-8, nó chỉ cần lấy chuỗi theo nghĩa đen. Các trình phân tích cú pháp đơn giản có thể hỗ trợ Unicode theo cách này mà không thực sự hỗ trợ Unicode. Tuy nhiên, nhiều ngôn ngữ lập trình hỗ trợ rõ ràng Unicode.</p><h5>Mã hóa và PHP.</h5><p>PHP không hỗ trợ Unicode. Đúng là anh ấy hỗ trợ nó khá tốt. Đoạn trước cho thấy cách đưa trực tiếp các ký tự UTF-8 vào văn bản chương trình mà không gặp vấn đề gì, vì UTF-8 tương thích ngược với ASCII và đó là tất cả những gì PHP cần. Tuy nhiên, tuyên bố “PHP không hỗ trợ Unicode” là đúng và đã gây ra nhiều nhầm lẫn trong cộng đồng PHP.</p><h6>Lời hứa sai lầm</h6><p>Một trong những điều thú vị của tôi là các hàm utf8_encode và utf8_decode. Tôi thường thấy những điều ngu ngốc như "Để sử dụng Unicode trong PHP, bạn cần gọi utf8_encode ở văn bản đầu vào và utf8_decode ở đầu ra." Hai hàm này hứa hẹn một số loại chuyển đổi tự động văn bản UTF-8, được cho là bắt buộc, vì “PHP không hỗ trợ Unicode”. Nếu bạn đang đọc bài viết này không theo đường chéo thì bạn biết rằng</p><ol><li>Không có gì đặc biệt về UTF-8</li> <li>Thực tế là bạn không thể mã hóa văn bản thành UTF-8</li> </ol><p>Hãy để tôi giải thích điểm 2: bất kỳ văn bản nào cũng đã được mã hóa bằng thứ gì đó. Khi bạn chèn dòng vào <a href="https://viws.ru/vi/ishodnyi-kod-klavishi-kak-otkryt-ishodnyi-kod-stranicy.html">nguồn</a>, họ đã có mã hóa rồi. Chính xác hơn là mã hóa mà bạn hiện đang sử dụng. <a href="https://viws.ru/vi/kak-vklyuchit-tekstovyi-redaktor-v-kompyutere-tekstovyi-redaktor-bloknot.html">soạn thảo văn bản</a>. Nếu bạn lấy chúng từ cơ sở dữ liệu thì chúng đã được mã hóa rồi. Nếu bạn đang đọc chúng từ một tập tin... bạn đã biết rồi phải không?</p><p>Văn bản được mã hóa UTF-8 hoặc không được mã hóa. Nếu không, thì nó được mã hóa bằng ASCII, ISO-8859-1, UTF-16 hoặc thứ gì khác. Nếu nó không có trong UTF-8 nhưng được cho là chứa "ký tự UTF-8", thì bạn có sự bất đồng về nhận thức. Nếu văn bản vẫn chứa các ký tự cần thiết được mã hóa bằng UTF-8 thì đó là UTF-8.</p><p>Vậy utf8_encode làm cái quái gì vậy?</p><blockquote>"Chuyển đổi chuỗi ISO-8859-1 sang mã hóa UTF-8"</blockquote><p>Vâng! Tác giả muốn nói rằng hàm chuyển đổi văn bản từ ISO-8859-1 sang UTF-8. Đó là mục đích của nó. Một cái tên khủng khiếp như vậy có lẽ đã được đặt cho nó bởi một người châu Âu ngẫu hứng nào đó. Điều tương tự cũng áp dụng cho utf8_decode. Các chức năng này không thể áp dụng cho bất kỳ mục đích nào khác ngoài việc chuyển đổi từ ISO-8859-1 sang UTF-8. Nếu bạn cần một cặp mã hóa khác, hãy sử dụng iconv. <br>utf8_encode không dành cho bạn <a href="https://viws.ru/vi/kak-vydelit-chast-izobrazheniya-v-fotoshope-drugie-sposoby.html">đũa phép</a>, cần phải vẫy tay trên mỗi từ vì “PHP không hỗ trợ Unicode.” Cô ấy gọi <a href="https://viws.ru/vi/chto-delat-esli-dirty-bomb-ne-zapuskaetsya-dirty-bomb---reshenie-problem-dirty-bomb-lagaet.html">nhiều vấn đề hơn</a>, hơn là quyết định - hãy nói lời cảm ơn đến những lập trình viên châu Âu và thiếu hiểu biết đó.</p><h6>Native-shmativny</h6><p>Vậy họ có ý gì khi nói một ngôn ngữ hỗ trợ Unicode? Điều quan trọng là liệu ngôn ngữ có giả định rằng một ký tự chiếm một byte hay không. Do đó, PHP cho phép bạn truy cập ký tự đã chọn bằng cách xử lý chuỗi dưới dạng mảng ký tự:</p><p>Nếu chuỗi $ có mã hóa một byte thì nó sẽ cung cấp cho chúng ta ký tự đầu tiên. Nhưng chỉ vì “ký tự” giống với “byte” trong mã hóa một byte. PHP chỉ đưa ra byte đầu tiên mà không hề nghĩ đến các ký tự. Chuỗi trong PHP không gì khác hơn là các chuỗi byte, không hơn, không kém. Những “ký tự có thể đọc được” này của bạn không gì khác hơn là một phát minh của con người, PHP không quan tâm đến chúng.</p><blockquote>01000100 01101111 01101110 00100111 01110100<br>Đừng <br> 01100011 01100001 01110010 01100101 00100001<br>quan tâm!</blockquote><p>Điều tương tự cũng áp dụng cho nhiều người <a href="https://viws.ru/vi/kak-ubrat-vremennye-nenuzhnye-faily-primenenie-storonnih-utilit.html">tính năng tiêu chuẩn</a>, chẳng hạn như chất nền, strpos, phần cắt và những thứ khác. Hỗ trợ dừng khi ánh xạ byte-ký tự kết thúc:</p><blockquote>11100110 10111100 10100010 11100101 10101101 10010111<br> 漢 字 </blockquote><p>$string cho chuỗi đã chỉ định sẽ lại chỉ trả về byte đầu tiên, bằng 11100110. Nói cách khác, byte thứ ba của ký tự 漢. Chuỗi 11100110 không chính xác đối với UTF-8, do đó chuỗi hiện tại cũng không chính xác. Nếu bạn cũng nghĩ như vậy, bạn có thể thử một cách mã hóa khác, trong đó 11100110 sẽ được chấp nhận bằng cách nào đó <a href="https://viws.ru/vi/nuzhno-li-stavit-parol-na-wifi-kak-sdelat-parol-iz-sluchainyh-simvolov.html">biểu tượng ngẫu nhiên</a>. Bạn có thể vui chơi, chỉ là không có trên máy chủ chiến đấu.</p><p>Đó là tất cả. "PHP không hỗ trợ Unicode" có nghĩa là hầu hết các hàm trong ngôn ngữ đều giả định rằng một byte bằng một ký tự, dẫn đến các ký tự nhiều byte bị cắt bớt hoặc độ dài chuỗi bị tính toán không chính xác. Điều này không có nghĩa là bạn không thể sử dụng Unicode trong PHP hoặc bất kỳ văn bản nào cũng cần được chạy qua utf8_encode hoặc một số nội dung vô nghĩa khác.</p><p>May mắn thay, có một tiện ích mở rộng đặc biệt bổ sung tất cả các tính năng quan trọng <a href="https://viws.ru/vi/javascript-poluchit-opredelennyi-simvol-v-stroke-osnovnye-strokovye-funkcii.html">hàm chuỗi</a>, nhưng có hỗ trợ mã hóa nhiều byte. mb_substr($string, 0, 1, ‘UTF-8’) trên dòng trên sẽ trả về chính xác chuỗi 11100110 10111100 10100010, tương ứng với ký tự 漢. Bởi vì hàm cần suy nghĩ về những gì nó đang làm nên nó cần phải được mã hóa. Do đó, các hàm này lấy tham số $encoding. Nhân tiện, mã hóa có thể được đặt chung cho tất cả các hàm mb_ ​​bằng cách sử dụng mb_internal_encoding.</p><h6>Việc sử dụng và lạm dụng xử lý lỗi PHP</h6><p>Toàn bộ vấn đề với việc hỗ trợ Unicode (không phải) trong PHP là trình thông dịch không quan tâm. Chuỗi byte, ha. Đừng quan tâm chúng có ý nghĩa gì. Không có gì được thực hiện ngoài việc lưu trữ chuỗi trong bộ nhớ. PHP thậm chí còn không có khái niệm như vậy – mã hóa. Và miễn là bạn không cần thao tác với chuỗi thì không vấn đề gì. Công việc được thực hiện với các chuỗi byte có thể được ai đó coi là ký tự. PHP chỉ yêu cầu bạn lưu mã nguồn ở dạng tương thích với ASCII. Trình phân tích cú pháp PHP tìm kiếm các ký tự cụ thể để cho nó biết phải làm gì. 00100100 nói: “khai báo một biến”, 00111101 – “gán”, 00100010 – bắt đầu hoặc kết thúc một dòng, v.v. Mọi thứ không quan trọng đối với trình phân tích cú pháp đều được coi là chuỗi ký tự byte. Điều này cũng áp dụng cho mọi thứ được đặt trong dấu ngoặc kép. Điều này có nghĩa là:</p><ol><li>Bạn sẽ không thể lưu nguồn PHP ở dạng mã hóa không tương thích với ASCII. Ví dụ: trong UTF-16, ký tự trích dẫn được mã hóa thành 00000000 00100010. Đối với PHP, coi mọi thứ là ASCII, đây là byte NUL theo sau là một trích dẫn. PHP có thể sẽ gặp trục trặc đối với mọi ký tự và trở thành NUL.</li> <li>Bạn có thể lưu PHP ở dạng mã hóa tương thích ASCII. Nếu 128 điểm mã hóa đầu tiên khớp với ASCII thì PHP sẽ ăn chúng. Tất cả <a href="https://viws.ru/vi/smailiki-iz-simvolov-na-klaviature-telefona-chto-znachit-smailik.html">nhân vật quan trọng</a>đối với PHP nằm trong 128 điểm đầu tiên được xác định bởi ASCII. Nếu chuỗi ký tự chứa bất cứ thứ gì vượt quá giới hạn này, PHP sẽ không chú ý. Bạn có thể lưu nguồn ở định dạng ISO-8859-1, Mac Roman, UTF-8 hoặc bất kỳ mã hóa nào khác. Các ký tự chuỗi trong mã của bạn sẽ nhận được mã hóa mà bạn lưu tệp.</li> <li>Bất kì <a href="https://viws.ru/vi/prilozhenie-vneshnii-nakopitel-na-androide-kak-podklyuchit-usb-fleshku-k-android.html">tập tin bên ngoài</a>đối với PHP nó có thể có bất kỳ mã hóa nào. Nếu trình phân tích cú pháp không cần xử lý tệp thì nó sẽ rất vui. <blockquote>$foo = file_get_contents("bar.txt");</blockquote><p>Ở trên sẽ chỉ đặt các byte từ bar.txt vào biến $foo. PHP sẽ không cố gắng diễn giải, mã hóa hoặc thao túng nội dung. Tệp có thể chứa dữ liệu nhị phân hoặc hình ảnh, PHP không quan tâm.</p></li> <li>Nếu mã hóa bên ngoài và bên trong phải khớp nhau thì chúng thực sự cần như vậy. Một trường hợp phổ biến là bản địa hóa: trong mã bạn viết một cái gì đó như echo localize('Foobar') và trong tệp bên ngoài là: <blockquote>msgstr "Foobar" <br>msgstr "フーバー" <br></blockquote><p>Cả hai chuỗi Foobar phải có biểu diễn bit giống hệt nhau. Nếu mã nguồn ở dạng ASCII và mã bản địa hóa ở dạng UTF-16 thì bạn đã không gặp may. Chuyển đổi bổ sung cần phải được thực hiện.</p></li> </ol><p>Một người đọc tinh tường có thể hỏi liệu có thể lưu trữ tuần tự một byte UTF-16 thành một chữ không <a href="https://viws.ru/vi/online-vklyuchaya-odin-ishodnyi-fail-c-v-drugoi-perevod-vklyuchaya-odin.html">tập tin nguồn</a> bằng ASCII và câu trả lời sẽ luôn là: tất nhiên.</p><blockquote>01100101 01100011 01101000 01101111 00100000 00100010<br>ờ ờ" <br> 11111110 11111111 00000000 01010101 00000000 01010100<br>(điểm đánh dấu UTF-16) U T <br> 00000000 01000110 00000000 00101101 00000000 00110001<br>F-1 <br> 00000000 00110110 00100010 00111011<br> 6 " ; </blockquote><p>Dòng đầu tiên và 2 byte cuối cùng là từ ASCII. Phần còn lại được biểu thị bằng UTF-16, 2 byte cho mỗi ký tự. 11111110 11111111 hàng đầu trên dòng thứ hai là điểm đánh dấu để bắt đầu văn bản trong UTF-16 (bắt buộc theo tiêu chuẩn, PHP chưa bao giờ nghe nói về điều này). Tập lệnh này xuất ra chuỗi “UTF-16” được mã hóa bằng UTF-16 vì nó chỉ xuất ra các byte giữa hai dấu ngoặc kép, dẫn đến văn bản “UTF-16” được mã hóa bằng UTF-16. Mặt khác, nguồn không hoàn toàn chính xác ở dạng ASCII hoặc UTF-16, vì vậy bạn có thể mở một trình soạn thảo và tận hưởng một chút.</p><h6>Tổng cộng</h6><p>PHP hỗ trợ Unicode, hay chính xác hơn là bất kỳ mã hóa nào khá chính xác, miễn là bạn có thể khiến trình phân tích cú pháp thực hiện công việc của nó và nhà phát triển hiểu được nó đang làm gì. Bạn chỉ cần cẩn thận khi làm việc với chuỗi: chia, xóa khoảng trắng, đếm và tất cả các thao tác khác yêu cầu làm việc với ký tự, không phải byte. Nếu bạn không làm bất cứ điều gì với các chuỗi ngoài đọc và in, bạn sẽ khó gặp phải những vấn đề không tồn tại ở các ngôn ngữ khác.</p><h5>Ngôn ngữ có hỗ trợ mã hóa</h5><p>Vậy việc một ngôn ngữ hỗ trợ Unicode có ý nghĩa gì? Ví dụ Javascript hỗ trợ Unicode. Trên thực tế, bất kỳ chuỗi nào trong Javascript đều được mã hóa bằng UTF-8. Và đây là mã hóa duy nhất mà Javascript hoạt động. Bạn sẽ không vào được <a href="https://viws.ru/vi/naiti-vse-vhozhdeniya-podstroki-v-stroku-javascript-osnovnye-strokovye.html">Chuỗi Javascript</a> không có trong UTF-8. Javascript tôn thờ Unicode đến mức đơn giản là không có công cụ nào trong cốt lõi của ngôn ngữ để hoạt động với các bảng mã khác. Vì Javascript thường chạy nhất trong trình duyệt nên bạn không gặp vấn đề gì: trình duyệt có thể thực hiện logic mã hóa và giải mã I/O tầm thường.</p><p>Các ngôn ngữ khác chỉ đơn giản hỗ trợ mã hóa. <a href="https://viws.ru/vi/dinamicheskaya-marshrutizaciya-protokoly-i-rabota-vnutrennie.html">Công việc nội tâm</a>được thực hiện bằng một mã hóa duy nhất, thường là UTF-16. Nhưng điều này có nghĩa là họ cần được cho biết văn bản đó đang được mã hóa bằng cách nào, nếu không họ sẽ cố gắng tự xác định nó. Cần phải chỉ ra mã nguồn được lưu bằng mã hóa nào, tệp sẽ đọc sẽ được lưu theo mã hóa nào và đầu ra sẽ được thực hiện bằng mã hóa nào. Ngôn ngữ sẽ thực hiện chuyển đổi nhanh chóng nếu được chỉ định rằng nên sử dụng Unicode. Họ làm mọi thứ mà trong PHP cần phải được thực hiện bán tự động ở đâu đó trong nền. Không tốt hơn hay tệ hơn PHP, chỉ khác biệt thôi. <a href="https://viws.ru/vi/yandeks-vypustila-assistenta-alisu-chem-on-luchshe-siri-podpiska-na-novosti.html">Tin tốt</a> Vấn đề là các hàm chuỗi cuối cùng vẫn hoạt động và bạn không phải lo lắng về việc chuỗi có chứa các ký tự nhiều byte hay không, nên chọn hàm nào để làm việc và những việc khác mà bạn sẽ phải làm trong PHP.</p><h5>Unicode hoang dã</h5><p>Vì Unicode giải quyết được rất nhiều <a href="https://viws.ru/vi/pri-obnovlenii-csgo-proizoshla-oshibka-reshenie-razlichnyh-problem-s-counter-strike.html">nhiều vấn đề khác nhau</a> và hoạt động trong nhiều tình huống khác nhau, bạn phải trả giá bằng cách đào sâu vào vùng hoang dã. Ví dụ: tiêu chuẩn Unicode chứa thông tin về cách giải quyết các vấn đề như thống nhất các chữ tượng hình YAKK. Nhiều biểu tượng phổ biến ở Nhật Bản, Trung Quốc và Hàn Quốc được mô tả hơi khác nhau. Hay vấn đề chuyển đổi ký tự từ chữ thường sang chữ hoa, ngược lại hay qua lại không phải lúc nào cũng đơn giản như bảng mã của các ngôn ngữ Tây Âu. Một số biểu tượng có thể được thể hiện bằng các mục khác nhau. Ví dụ: chữ ö có thể được biểu thị bằng mục U+00F6 (“THƯ LATIN NHỎ O CÓ DIARESIS”) hoặc dưới dạng hai mục U+006F (“CHỮ NHỎ O”) VÀ U+0308 (“THAY ĐỔI DIARESIS”) , có nghĩa là chữ o With. Trong UTF-8, nó là 2 byte hoặc 3 byte, trong cả hai trường hợp đều biểu thị một ký tự bình thường. Do đó, có các quy tắc chuẩn hóa trong tiêu chuẩn, tức là làm thế nào để chuyển đổi các hình thức này từ dạng này sang dạng khác. Điều này và nhiều điều khác nằm ngoài phạm vi của bài viết này, nhưng bạn cần biết về những điểm này.</p><h5>Tôi không ép nó nữa!</h5><ol><li>Văn bản luôn là một chuỗi các bit cần được dịch sang ngôn ngữ tự nhiên bằng cách sử dụng bảng. Bảng không hợp lệ - biểu tượng không hợp lệ.</li> <li>Bạn không thể làm việc trực tiếp với văn bản - bạn luôn phải làm việc với các phần được gói gọn trong các phần trừu tượng. Các lỗi là do lỗi ở một trong những phần tóm tắt.</li> <li>Các hệ thống truyền thông tin cho nhau phải luôn chỉ ra mã hóa đang hoạt động. Ví dụ: trang web cho trình duyệt biết rằng nó cung cấp thông tin ở dạng UTF-8.</li> <li>Ngày nay, UTF-8 tương thích ngược với ASCII, mặc dù thực tế là nó có thể mã hóa hầu như mọi ký tự và vẫn tương đối hiệu quả trong hầu hết các trường hợp. Các bảng mã khác cũng có công dụng của chúng, nhưng phải có lý do chính đáng để bận tâm với các bảng mã chỉ hỗ trợ một phần Unicode.</li> <li>Cả chương trình và người lập trình đều phải giải quyết vấn đề khớp byte và ký tự.</li> </ol><p>Bây giờ bạn không cần phải bào chữa khi làm lộn xộn văn bản nữa.</p><p>Thẻ: Thêm thẻ</p> <p>Trong hai năm qua, đã có một số tiến bộ đáng chú ý trong việc xây dựng các mã sửa lỗi. Người ta đã tìm ra các phương pháp để xây dựng các mã rất dài và hiệu quả; và quan trọng nhất là những quy tắc này hóa ra lại phù hợp để triển khai thực tế. Đồng thời, nhu cầu về các kênh truyền thông ngày càng tăng cao. <a href="https://viws.ru/vi/stiralnaya-mashina-luchshaya-marka-proizvoditeli-stiralnyh-mashin-s.html">độ tin cậy cao</a>, có thể được sử dụng trong các tổ hợp máy tính và nhiều loại khác nhau <a href="https://viws.ru/vi/poisk-ustroistva-po-id-oborudovaniya-luchshie-programmy-dlya-avtomaticheskogo-obnovleniya-draiverov-windo.html">thiết bị tự động</a>. Khi nhu cầu về độ tin cậy cao hơn tăng lên thì hiệu quả chi phí của các thiết bị điện tử cũng tăng theo. <a href="https://viws.ru/vi/analiz-i-sintez-logicheskih-ustroistv-metody-minimizacii.html">thiết bị logic</a> và lý thuyết mã hóa đang được phát triển sâu hơn, thời điểm đang đến gần khi các thiết bị phát hiện và sửa lỗi, tức là các thiết bị thuộc loại được mô tả trong cuốn sách này, sẽ đóng vai trò ngày càng quan trọng trong việc tạo ra các hệ thống thông tin phức tạp.</p><p>Chương này giới thiệu khái niệm về kênh liên lạc, mô tả vai trò của mã trong việc truyền thông tin, định nghĩa mã khối và giới thiệu các khái niệm quan trọng khác.</p><h3>1.1. liên kết</h3> <p>Sơ đồ <a href="https://viws.ru/vi/cifrovoi-blok-cifrovoi-blok-klavish-kak-nastroit-avtomaticheskii.html">hệ thống kỹ thuật số</a> kết nối được hiển thị trong hình. 1.1. Mô hình tương tự cũng mô tả hệ thống lưu trữ thông tin, nếu môi trường lưu trữ thông tin được coi là một kênh. Một kênh truyền thông tin điển hình là kênh điện thoại. Thiết bị lưu trữ thông tin điển hình là máy ghi băng, bao gồm đầu ghi và đầu đọc.</p><p>Cơm. 1.1. Sơ đồ khối <a href="https://viws.ru/vi/dlya-chego-prednaznacheny-izdatelskie-sistemy-obshchie-svedeniya-o.html">hệ thống chung</a> chuyển hoặc lưu trữ thông tin.</p><p>Nguồn thông tin điển hình là một tin nhắn bao gồm các chữ số nhị phân hoặc thập phân hoặc văn bản được viết bằng bảng chữ cái. Bộ mã hóa chuyển đổi các tin nhắn này thành tín hiệu có thể được truyền đi</p> <p>theo kênh. Tín hiệu điển hình là tín hiệu điện với một số hạn chế về công suất, băng thông và thời lượng. Những tín hiệu này đi vào kênh và bị méo do nhiễu. Sau đó, tín hiệu bị biến dạng đi vào thiết bị giải mã, thiết bị này sẽ tái tạo lại tin nhắn đã gửi và chuyển tiếp đến người nhận. Nhiệm vụ của kỹ sư viễn thông chủ yếu là xây dựng bộ mã hóa và giải mã, mặc dù nó cũng có thể bao gồm nhiệm vụ cải thiện chính kênh đó. Lưu ý rằng bộ mã hóa bao gồm một thiết bị thực hiện thao tác thường được gọi là điều chế và bộ giải mã bao gồm một thiết bị thực hiện phát hiện.</p><p>Hệ thống được hiển thị trong Hình. 1.1 quá chung chung để có thể sử dụng thuận tiện trong phân tích lý thuyết. Lý thuyết mã hóa tổng quát chỉ ra rằng một kênh truyền thông có dung lượng nhất định, các nguồn điển hình có tốc độ tạo thông tin nhất định và trong trường hợp tốc độ tạo thông tin của một nguồn nhỏ hơn <a href="https://viws.ru/vi/naibolshuyu-propusknuyu-sposobnost-po-peredachi-informacii-imeyut.html">băng thông</a> kênh, mã hóa và giải mã có thể được thực hiện sao cho xác suất giải mã sai nhỏ tùy ý.</p><p><img src='https://i1.wp.com/info.sernam.ru/archive/arch.php?path=../htm/book_code/files.book&file=code_2.files/image2.gif' width="100%" loading=lazy loading=lazy></p><p>Cơm. 1.2, Sơ đồ khối <a href="https://viws.ru/vi/shifrovanie-na-letu-shifrovanie-na-letu-bez-administrativnyh-prav-sostav.html">hệ thống điển hình</a> chuyển hoặc lưu trữ thông tin.</p><p>Vì vậy, mặc dù có hy vọng cho tương lai nhưng hiện tại lý thuyết này không cung cấp gì hơn ngoài những dấu hiệu mơ hồ về cách thiết kế một hệ thống truyền tải thông tin.</p><p>Đặc trưng <a href="https://viws.ru/vi/14-osnovnye-funkcii-sovremennoi-sistemy-ofisnoi-avtomatizacii-glavnye.html">hệ thống hiện đại</a> truyền tải thông tin được thể hiện trong hình. 1.2. Gần như tất cả <a href="https://viws.ru/vi/kak-vklyuchit-svedeniya-o-programmnom-obespechenii-v-edinyi-reestr-rossiiskih.html">máy tính</a> chuyển đổi thông tin đến thành nhị phân và sau đó xử lý nó ở dạng nhị phân. Nhiều hệ thống sử dụng mã trong đó có nhiều</p> <p>sự kết hợp của sáu ký tự nhị phân biểu thị số, chữ cái, dấu cách và các ký tự đặc biệt như dấu chấm câu. Một mã phổ biến khác sử dụng bốn chữ số nhị phân cho mỗi chữ số thập phân và hai chữ số thập phân cho mỗi chữ cái hoặc chữ số thập phân. <a href="https://viws.ru/vi/prikolnye-statusy-iz-simvolov-specialnye-simvoly-dlya-nika-zv-zdochki.html">tính cách đặc biệt</a>.</p><p>Một thiết bị mã hóa các ký hiệu nhị phân thành tín hiệu ở đầu vào của kênh đôi khi được gọi là bộ điều biến. Trong hầu hết các trường hợp, nó liên kết số một với xung và số 0 với việc không có xung hoặc xung có thể phân biệt rõ ràng với mã cho một xung. Việc chuyển đổi riêng biệt từng ký tự nhị phân này là một hạn chế chắc chắn làm giảm thông lượng kênh. Bộ giải mã xác định xem xung nhận được tiếp theo là 0 hay 1. Giải mã các xung riêng lẻ dẫn đến giảm thông lượng hơn nữa. Lý thuyết cho thấy hơn <a href="https://viws.ru/vi/kak-v-tablice-excel-sdelat-summu-summirovanie-v-excel-prostye.html">phương pháp phức tạp</a> mã hóa và giải mã tăng tốc độ truyền với cùng xác suất lỗi. Tuy nhiên, người ta vẫn chưa biết <a href="https://viws.ru/vi/chem-otkryt-djvu-tri-prostyh-besplatnyh-sposoba-chem-otkryt-djvu-faily--.html">cách hiệu quả</a> việc thực hiện các phương pháp này.</p><p>Các thiết bị sử dụng nhị phân để mã hóa và giải mã các ký tự nhị phân. <a href="https://viws.ru/vi/perevod-iz-shestnadcatirichnoi-v-dvoichnuyu-sistemu-schisleniya.html">mã nhị phân</a>, phát hiện và sửa lỗi.</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy loading=lazy>");</script> </div> <div class="comment_box" id="comments"> </div> </div> <div id="sidebar"> <div class="widget widget_nav_menu" id="nav_menu-2"> <div class="menu-mainmenu-container"> <ul id="menu-mainmenu-2" class="menu"> <li class="submenu"><a href="https://viws.ru/vi/category/internet/">Internet</a> </li> <li class="submenu"><a href="https://viws.ru/vi/category/programs/">Chương trình</a> </li> <li class="submenu"><a href="https://viws.ru/vi/category/instructions/">Hướng dẫn</a> </li> <li class="submenu"><a href="https://viws.ru/vi/category/browsers/">Trình duyệt</a> </li> <li class="submenu"><a href="https://viws.ru/vi/category/windows-10/">Windows 10</a> </li> <li class="submenu"><a href="https://viws.ru/vi/category/android/">Android</a> </li> <li class="submenu"><a href="https://viws.ru/vi/category/ios/">iOS</a> </li> <li class="submenu"><a href="https://viws.ru/vi/category/communication/">Sự liên quan</a> </li> </ul> </div> </div> <div class="widget"> <div class="heading star">Những ghi chú cuối cùng</div> <div class="popular_posts"> <div class="news_box"> <a href="https://viws.ru/vi/skachat-hromium-skachat-hromium-ustanovit-brauzer-hromium.html" class="thumb"><img width="95" height="95" src="/uploads/cbe5abfed43fc21803385205ca90e702.jpg" class="attachment-mini size-mini wp-post-image" alt="Tải xuống crom Cài đặt trình duyệt crom" sizes="(max-width: 95px) 100vw, 95px" / loading=lazy loading=lazy></a> <div class="element"> <div class="title"> <a href="https://viws.ru/vi/skachat-hromium-skachat-hromium-ustanovit-brauzer-hromium.html">Tải xuống crom Cài đặt trình duyệt crom</a> </div> </div> </div> <div class="news_box"> <a href="https://viws.ru/vi/na-iphone-ne-rabotaet-vai-fai-pochemu-tak-proishodit-i-kak-s-etim.html" class="thumb"><img width="95" height="95" src="/uploads/29376b41d023a7640d9c0c7a3b2a5c90.jpg" class="attachment-mini size-mini wp-post-image" alt="Wi-Fi không hoạt động trên iPhone 4s bật Wi-Fi." sizes="(max-width: 95px) 100vw, 95px" / loading=lazy loading=lazy></a> <div class="element"> <div class="title"> <a href="https://viws.ru/vi/na-iphone-ne-rabotaet-vai-fai-pochemu-tak-proishodit-i-kak-s-etim.html">Wi-Fi không hoạt động trên iPhone 4s bật Wi-Fi.</a> </div> </div> </div> <div class="news_box"> <a href="https://viws.ru/vi/chto-delat-esli-fleshka-v-kompyutere-postoyanno-to-propadaet.html" class="thumb"><img width="95" height="95" src="/uploads/c1b2e022ef0b940b6a4e0fb0c70e0fae.jpg" class="attachment-mini size-mini wp-post-image" alt="Ổ đĩa flash liên tục tắt và bật" sizes="(max-width: 95px) 100vw, 95px" / loading=lazy loading=lazy></a> <div class="element"> <div class="title"> <a href="https://viws.ru/vi/chto-delat-esli-fleshka-v-kompyutere-postoyanno-to-propadaet.html">Ổ đĩa flash liên tục tắt và bật</a> </div> </div> </div> <div class="news_box"> <a href="https://viws.ru/vi/standartnyi-nagruzochnyi-test-1s-standartnyi-nagruzochnyi-test.html" class="thumb"><img width="95" height="95" src="/uploads/2bc88c7460c0c6dc56bf8fa04d4ff3fc.jpg" class="attachment-mini size-mini wp-post-image" alt="Kiểm tra tải tiêu chuẩn" sizes="(max-width: 95px) 100vw, 95px" / loading=lazy loading=lazy></a> <div class="element"> <div class="title"> <a href="https://viws.ru/vi/standartnyi-nagruzochnyi-test-1s-standartnyi-nagruzochnyi-test.html">Kiểm tra tải tiêu chuẩn</a> </div> </div> </div> <div class="news_box"> <a href="https://viws.ru/vi/aliekspress-ne-ishchet-telefony-chto-delat-esli-propali-zakazy-v-lichnom-kabinete.html" class="thumb"><img width="95" height="95" src="/uploads/3ea3b7507423c9b8858724e854f269b5.jpg" class="attachment-mini size-mini wp-post-image" alt="Phải làm gì nếu đơn hàng trong tài khoản cá nhân của bạn trên Aliexpress bị thiếu?" sizes="(max-width: 95px) 100vw, 95px" / loading=lazy loading=lazy></a> <div class="element"> <div class="title"> <a href="https://viws.ru/vi/aliekspress-ne-ishchet-telefony-chto-delat-esli-propali-zakazy-v-lichnom-kabinete.html">Phải làm gì nếu đơn hàng trong tài khoản cá nhân của bạn trên Aliexpress bị thiếu?</a> </div> </div> </div> </div> </div> <div class="widget"> <div class="heading star">Phổ biến</div> <div class="popular_posts"> <div class="news_box"> <a href="https://viws.ru/vi/ne-pokazyvaet-ekran-v-skaipe-igrah-reshenie-problem-s-demonstraciei.html" class="thumb"><img width="95" height="95" src="/uploads/e6460c00b45a4d9c9713e956bf073116.jpg" class="attachment-mini size-mini wp-post-image" alt="Giải quyết vấn đề chia sẻ màn hình trên Skype" sizes="(max-width: 95px) 100vw, 95px" / loading=lazy loading=lazy></a> <div class="element"> <div class="title"> <a href="https://viws.ru/vi/ne-pokazyvaet-ekran-v-skaipe-igrah-reshenie-problem-s-demonstraciei.html">Giải quyết vấn đề chia sẻ màn hình trên Skype</a> </div> </div> </div> <div class="news_box"> <a href="https://viws.ru/vi/smart-tv-vybor-operacionnoi-sistemy-umnogo-televizora-operacionnaya.html" class="thumb"><img width="95" height="95" src="/uploads/f83bf6d87257f5eba353491c49bcb723.jpg" class="attachment-mini size-mini wp-post-image" alt="Hệ điều hành Tizen trên Smart Tivi Samsung Hệ điều hành Webos trên Tivi LG" sizes="(max-width: 95px) 100vw, 95px" / loading=lazy loading=lazy></a> <div class="element"> <div class="title"> <a href="https://viws.ru/vi/smart-tv-vybor-operacionnoi-sistemy-umnogo-televizora-operacionnaya.html">Hệ điều hành Tizen trên Smart Tivi Samsung Hệ điều hành Webos trên Tivi LG</a> </div> </div> </div> <div class="news_box"> <a href="https://viws.ru/vi/kolichestvo-argumentov-funkcii-esli-prilozheniya-microsoft-excel-chto-zhe-takoe-funkciya-v.html" class="thumb"><img width="95" height="95" src="/uploads/ddafc343643dcab4f4fe6f19dbbf6d90.jpg" class="attachment-mini size-mini wp-post-image" alt="Hàm trong Excel là gì?" sizes="(max-width: 95px) 100vw, 95px" / loading=lazy loading=lazy></a> <div class="element"> <div class="title"> <a href="https://viws.ru/vi/kolichestvo-argumentov-funkcii-esli-prilozheniya-microsoft-excel-chto-zhe-takoe-funkciya-v.html">Hàm trong Excel là gì?</a> </div> </div> </div> </div> </div> <div class="widget"> <div class="heading">Tin tức</div> <div class="business_news"> <div class="news"> <div class="date">2024-05-23 01:40:21</div> <a href="https://viws.ru/vi/gde-skachat-virtual-tuner-dlya-nastroiki-gitary-programmy-dlya-nastroiki-gitary-na.html" class="title">Các chương trình điều chỉnh guitar trên máy tính</a> </div> <div class="news"> <div class="date">2024-05-22 01:37:38</div> <a href="https://viws.ru/vi/skachat-prilozhenie-gugl-plei-na-noutbuk-besplatnaya-ustanovka-na.html" class="title">Miễn phí cài đặt CH Play trên Laptop</a> </div> <div class="news"> <div class="date">2024-05-22 01:37:38</div> <a href="https://viws.ru/vi/fail-lab-kak-preobrazovat-lab-fail-v-pdf-fail-alternativnyi.html" class="title">Cách chuyển đổi tập tin LAB sang tập tin PDF</a> </div> <div class="news"> <div class="date">2024-05-22 01:37:38</div> <a href="https://viws.ru/vi/chto-takoe-kesh-brauzer-kak-ego-pochistit-sposoby-ochistki-kesha-na-kompyutere-ili.html" class="title">Các cách xóa bộ nhớ đệm trên máy tính, laptop</a> </div> <div class="news"> <div class="date">2024-05-21 01:37:12</div> <a href="https://viws.ru/vi/zaryadnoe-ustroistvo-port-usb-c-usb-type-c-universalnyi-razem-dlya-vsego-chto-takoe.html" class="title">USB Type-C: đầu nối đa năng cho mọi thứ</a> </div> </div> </div> <div class="widget ai_widget" id="ai_widget-5"> <div class='dynamic dynamic-13' style='margin: 8px 0; clear: both;'> </div> </div> </div> </div> </div> </div> <div id="footer"> <div class="fixed"> <div class="inner"> <div class="footer_l"> <a href="https://viws.ru/vi/" class="logo" style="background:none;">viws.ru</a> <div class="copyright"> <p>viws.ru - Tất cả về công nghệ hiện đại. Sự cố, mạng xã hội, internet, virus</p> <p><span>2024 - Bảo lưu mọi quyền</span></p> </div> </div> <div class="footer_c"> <ul id="menu-topmenu-1" class="nav"> <li><a href="https://viws.ru/vi/feedback.html">Liên lạc</a></li> <li><a href="">Giới thiệu về trang web</a></li> <li><a href="">Quảng cáo trên trang web</a></li> </ul> <div class="footer_menu"> <ul id="menu-nizhnee-1" class=""> <li id="menu-item-"><a href="https://viws.ru/vi/category/internet/">Internet</a></li> <li id="menu-item-"><a href="https://viws.ru/vi/category/programs/">Chương trình</a></li> <li id="menu-item-"><a href="https://viws.ru/vi/category/instructions/">Hướng dẫn</a></li> <li id="menu-item-"><a href="https://viws.ru/vi/category/browsers/">Trình duyệt</a></li> </ul> <ul id="menu-nizhnee-2" class=""> <li id="menu-item-"><a href="https://viws.ru/vi/category/internet/">Internet</a></li> <li id="menu-item-"><a href="https://viws.ru/vi/category/programs/">Chương trình</a></li> <li id="menu-item-"><a href="https://viws.ru/vi/category/instructions/">Hướng dẫn</a></li> <li id="menu-item-"><a href="https://viws.ru/vi/category/browsers/">Trình duyệt</a></li> </ul> </div> </div> </div> </div> </div> </div> <script type="text/javascript">jQuery(function($) { $(document).on("click", ".pseudo-link", function(){ window.open($(this).data("uri")); } );} );</script> <script type='text/javascript' src='https://viws.ru/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=4.9.2'></script> <script type='text/javascript' src='https://viws.ru/wp-content/plugins/table-of-contents-plus/front.min.js?ver=1509'></script> <script type='text/javascript' src='https://viws.ru/wp-content/themes/delo/assets/scripts/theme.js'></script> <script type='text/javascript'> var q2w3_sidebar_options = new Array(); q2w3_sidebar_options[0] = { "sidebar" : "sidebar", "margin_top" : 60, "margin_bottom" : 200, "stop_id" : "", "screen_max_width" : 0, "screen_max_height" : 0, "width_inherit" : false, "refresh_interval" : 1500, "window_load_hook" : false, "disable_mo_api" : false, "widgets" : ['text-8','ai_widget-5'] } ; </script> <script type='text/javascript' src='https://viws.ru/wp-content/plugins/q2w3-fixed-widget/js/q2w3-fixed-widget.min.js?ver=5.0.4'></script> <script async="async" type='text/javascript' src='https://viws.ru/wp-content/plugins/akismet/_inc/form.js?ver=4.0.1'></script> </body> </html>