Так была изобретена блестящая концепция UTF-8. UTF-8 была еще одной системой для хранения вашей строки кодовых точек Unicode, тех магических чисел U +, в памяти, используя 8-битные байты. В UTF-8 каждая кодовая точка от 0 до 127 хранится в одном байте. Только кодовые точки 128 и выше сохраняются с использованием 2, 3, фактически до 6 байтов.
Это имеет приятный побочный эффект: английский текст в UTF-8 выглядит точно так же, как и в ASCII, поэтому американцы даже не замечают ничего плохого. Только остальной мир должен прыгать через обручи. В частности, Hello, который был U + 0048 U + 0065 U + 006C U + 006C U + 006F, будет сохранен как 48 65 6C 6C 6F, что, вот! такое же, как и в ASCII, и в ANSI, и в каждом OEM-наборе символов на планете. Теперь, если вы настолько смелы, чтобы использовать буквы с акцентом или греческие буквы или буквы клингона, вам придется использовать несколько байтов для хранения одной кодовой точки, но американцы никогда не заметят. (UTF-8 также обладает хорошим свойством, которое игнорирует старый код обработки строк, который хочет использовать один 0-байт в качестве нулевого терминатора, не будет обрезать строки).
До сих пор я говорил вам о трех способах кодирования Unicode. Традиционные методы store-it-in-двухбайтовые называются UCS-2 (потому что он имеет два байта) или UTF-16 (потому что он имеет 16 бит), и вам все еще нужно выяснить, является ли это UCS 2 или младший байтовый код UCS-2. И есть популярный новый стандарт UTF-8, который обладает прекрасным свойством также работать респектабельно, если у вас есть счастливое совпадение программ на английском языке и программ для мозговых мертвецов, которые совершенно не знают, что есть что-то кроме ASCII.
На самом деле существует множество других способов кодирования Unicode. Есть что-то под названием UTF-7, которое во многом похоже на UTF-8, но гарантирует, что старший бит всегда будет равен нулю, так что если вам придется пропустить Unicode через какую-то драконовскую систему электронной почты полицейского государства, которая думает, что 7 бит вполне достаточно, спасибо, что он все еще может выжать невредимым. Есть UCS-4, в котором каждая кодовая точка хранится в 4 байтах, и у нее есть замечательное свойство, заключающееся в том, что каждая отдельная кодовая точка может храниться в том же количестве байтов, но, черт возьми, даже техасцы не будут настолько смелыми, чтобы тратить их впустую. столько памяти.
И фактически теперь, когда вы думаете о вещах в терминах платонических идеальных букв, которые представлены кодовыми точками Unicode, эти кодовые точки Unicode могут быть закодированы в любой схеме кодирования старой школы! Например, вы можете закодировать строку Unicode для Hello (U + 0048 U + 0065 U + 006C U + 006C U + 006F) в ASCII, или в старой греческой кодировке OEM-производителя, или в кодировке иврита ANSI, или в любой из нескольких сотен кодировок. которые были изобретены до сих пор, с одним уловом: некоторые буквы могут не отображаться! Если нет эквивалента для кодовой точки Unicode, которую вы пытаетесь представить в кодировке, в которой вы пытаетесь ее представить, вы обычно получаете небольшой знак вопроса: или, если ты действительно хорош, коробка. Что вы получили? ->
Существуют сотни традиционных кодировок, которые могут правильно хранить только некоторые кодовые точки и превращать все остальные кодовые точки в вопросительные знаки. Некоторые популярные кодировки английского текста: Windows-1252 (стандарт Windows 9x для западноевропейских языков) и ISO-8859-1, также известный как Latin-1 (также полезный для любого западноевропейского языка). Но попробуйте хранить русские или ивритские буквы в этих кодировках, и вы получите кучу вопросительных знаков. Все UTF 7, 8, 16 и 32 обладают хорошим свойством возможности правильно хранить любую кодовую точку.