php ascii код символа

Php ascii код символа

Прежде чем приступить к изучению этого вопроса, рассмотрим, что такое ASCII-коды, для чего они применяются и почему получили широкое распространение.

При создании компьютеров инженеры долго искали рациональное решение задачи способа хранения символов, которые вы видите на вашем мониторе. Не вникая в подробности, можно сказать просто, что символ расположен на мониторе и при нажатик клавиши происходит его появление. Но задумывались ли вы когда-нибудь над тем, как же осуществляется работа с этим самым символом в вашем компьютере, каким способом происходит удержание этого символа в памяти вашего компьютера? На самом деле это очень сложный процесс, поэтому мы расскажем поверхностно, углубляясь только в ту часть, которая действительна поможет вам при создании скриптов.

Символы, которые вы видите на экране вашего монитора, сохраняются в памяти компьютера при помощи кодов. Разработчиками была создана таблица кодов ANSI (American National Standards Institute), используемых при хранении символов в памяти компьютера или файлах. Таблица кодов ANSI содержит расширенный набор кодов ASCII (American Standard Codes for Information Interchange). Начальные 128 кодов ASCII были разработаны для телетайпных коммуникаций. Первые 32 кода — управляющие, хотя только четыре из них используются в программах под Windows. Коды от 32 до 127 принадлежат обычным алфавитно-цифровым символам латинского языка, специальным символам и знакам операций. Коды от 128 до 255 принадлежат дополнительному набору символов. Обратите внимание на то, что дополнительные символы, используемые программами под MS-DOS, отличаются от дополнительных символов, используемых программами под Windows.

Теперь перейдем к изучению функций, осуществляющих работу с этими кодами. Описываемые функции будут либо возвращать символ согласно значению таблицы кодов ASCII, либо, наоборот, преобразовывать его из символа в код, соответствующий коду этого символа в таблице кодов ASCII. Процесс преобразования является двухсторонний, поэтому и будет рассмотрено две функции:

Функция chr() позволяет возвращать строку символа, соответствующего коду ASCII, указанного в качестве параметров данной Синтаксис функции chr():

string chr(int ascii)

Функция chr() возвращает односимвольную строку, соответствующую указанному коду ASCII на месте параметра ASCII. Рассмотрим пример:

Здесь приведен список преобразования ASCII-кодов в обычные символы. В примере специально взят перечень элементов, чтобы вы могли проследить систематическую последовательность изменяющихся ASCII-кодов. Результатом работы данного примера будет совокупность символов:

Преобразование кодов ASCII в символы

Источник

UTF-8 в PHP. Часть 1

1. Вступление

Для понимания дальнейшего текста начинающим нужно знать некоторые детали по кодировкам в целом. Подачу материала я постараюсь максимально упростить. Для незнающих ничего о побитовых операциях необходимо предварительно ознакомиться с материалами на википедии.

Начать нужно с понимания того, что компьютер работает с числами и хранить строку (и символ, как её часть) приходиться тоже в числовом виде. Для этих целей существуют кодировки. По сути это таблицы, в которых указано соответствие между числами и символами. Исторически сложилось, что основная кодировка ASCII содержит лишь контрольные коды и латинские символы, всего их 128 (127 – максимальное число, которое можно хранить в 7 битах).

Для того чтобы хранить и другие тексты на основе ASCII было создано много других кодировок, в которых добавили 8-ой бит. Они могут хранить уже до 256 символов, первые 128 с которых традиционно соответствовали ASCII, а вот в остальную часть каждый пихал всё, что ему хотелось. Так и получилось, что у каждого производителя операционных систем свои наборы кодировок, причём каждая удовлетворяла потребности лишь относительно узкого круга людей. Ситуацию ещё сильнее усложнили отсутствием общих стандартов, различать их алгоритмически стало невозможно и теперь это больше похоже на угадывание (об этом в следующих частях).

В итоге потребовался универсальный выход, кодировка, которая сможет хранить все возможные символы и будет учитывать различия в письме различных народов (например, направление письма). Поставленную задачу решили созданием Unicode, которая способна кодировать практически все системы письменности в мире одной кодировкой.

Хотелось бы подробнее остановиться на последнем пункте. Это значит, что если раньше можно было выполнять простое преобразование по таблице и записывать результат, то сейчас определён и метод сохранения этого результата, в зависимости от разрядности, которая требуется для его хранения. На примере принцип хранения вы можете увидеть в таблице (x – хранимые биты данных):

БитМаксимальное хранимое значение1 октет2 октет3 октет4 октет
Начальный октетПродолжающие октеты
7U+007F0xxxxxxx
11U+07FF110xxxxx10xxxxxx
16U+FFFF1110xxxx10xxxxxx10xxxxxx
21U+10FFFF (по стандарту, но реально U+1FFFFF)11110xxx10xxxxxx10xxxxxx10xxxxxx

Легко заметить, что в старших битах начального октета всегда находится счётчик, указывающий на количество байт в последовательности – это количество ведущих единиц, после которых идёт ноль. Обратите внимание: если октет лишь один, то ведущая единица не указывается, благодаря чему начальные октеты легко отличить от продолжающих.

Для примера давайте посмотрим как строка «Привет Hi» будет выглядеть в кодировке UTF-8.

Шаг первый. Перевести каждый символ в его числовое представление (я буду использовать шестнадцатеричную систему исчисления) по таблице.

Привет Hi = 0x041F 0x0440 0x0438 0x0432 0x044D 0x0442 0x0020 0x0048 0x0069
Не забываем, что пробел – тоже символ.

Шаг второй. Конвертировать числа из шестнадцатеричной в двоичную систему. Используем калькулятор Windows 7 (в режиме программиста).

0x041F = 0000 0100 0001 1111
0x0440 = 0000 0100 0100 0000
0x0438 = 0000 0100 0011 1000
0x0432 = 0000 0100 0011 0010
0x0435 = 0000 0100 0011 0101
0x0442 = 0000 0100 0100 0010
0x0020 = 0010 0000
0x0048 = 0100 1000
0x0069 = 0110 1001
Для наглядности я добавил нули в старшие разряды. Обратите внимание: символы могут занимать разное количество байт.

Шаг третий. Перевести числовые представления в последовательности октетов UTF-8.

0x041F = 100 0001 1111 = 110xxxxx 10xxxxxx = 11010000 10011111
0x0440 = 100 0100 0000 = 110xxxxx 10xxxxxx = 11010001 10000000
0x0438 = 100 0011 1000 = 110xxxxx 10xxxxxx = 11010000 10111000
0x0432 = 100 0011 0010 = 110xxxxx 10xxxxxx = 11010000 10110010
0x0435 = 100 0011 0101 = 110xxxxx 10xxxxxx = 11010000 10110101
0x0442 = 100 0100 0010 = 110xxxxx 10xxxxxx = 11010001 10000010
0x0020 = 010 0000 = 0xxxxxx = 00100000
0x0048 = 100 1000 = 0xxxxxx = 01001000
0x0069 = 110 1001 = 0xxxxxx = 01101001
Счётчики выделены жирным. Обратите внимание: символы с кодами до 0x0080 сохраняются без изменений, это и есть совместимость с ASCII. Ещё следует понимать, что UTF-8 будет занимать в 2 раза больше места (2 байта) для русскоязычного текста, чем Windows-1251, которая использует лишь 1 байт.

В качестве решения можно записать всю последовательность подряд (надеюсь без ошибок): «11010000 10011111 11010001 10000000 11010000 10111000 11010000 10110010 11010000 10110101 11010001 10000010 00100000 01001000 01101001».

Проверить решение можно кодом:

Оптимизированный PHP код, который позволяет получать числовое представление символов и обратную операцию (полную версию опубликую в конце цикла):

Метод getChar() был взят с библиотеки Jevix, я всё-равно уже видел этот код, хорошо его запомнил и даже при его реализации по памяти было бы нечестно не упомянуть автора.

Вы же можете протестировать получившийся класс при помощи кода:

Я не старался писать самый красивый или правильный код для тестов, но при помощи него вы можете спокойно побитово менять значения символов и сразу видеть результат. Все невалидные последовательности будут проигнорированы, выводимая строка всегда валидна, но это ещё далеко не всё.

Чтобы быть уверенным, что текст не содержит ничего лишнего нужно удалить с него ненужные (непечатные, нарушающие разметку, неопределённые, суррогатные и т.п.) символы и провести нормализацию, об этом в следующей части.

Дальше будет про нормализацию, безопасность, определение кодировок и работу с UTF-8 в PHP.

Источник

Получение определенного символа строки

Как получить определенный символ строки, способы получения символа из строки в php с примерами!

Нам нужно получить из строки определенный символ! как это сделать!?

Получим определенный символ строки в php

Самый простой способ получить символ строки в php

Для иллюстрации получения символа строки нам потребуется какая-то строка:

Результат получения и вывода определенного символа строки:

Если вы были внимательны, то должны были обратить внимание, на то, что буква выводится 6 по счету. а нам нужна была 5. дело в том, что здесь работает тоже правило, что и с массивом. счет начинается с нуля. и [0] это 1. как бы странно это не звучало! php ascii код символа. wall. php ascii код символа фото. php ascii код символа-wall. картинка php ascii код символа. картинка wall. Прежде чем приступить к изучению этого вопроса, рассмотрим, что такое ASCII-коды, для чего они применяются и почему получили широкое распространение., возможно, что через несколько лет вы привыкните, а может и нет. php ascii код символа. unknown. php ascii код символа фото. php ascii код символа-unknown. картинка php ascii код символа. картинка unknown. Прежде чем приступить к изучению этого вопроса, рассмотрим, что такое ASCII-коды, для чего они применяются и почему получили широкое распространение.

Получить символ строки кириллица utf-8

Как получить символ строки кириллица utf-8

Для иллюстрации получения символа строки в кириллице, нам потребуется эта самая строка на кириллице.

Если мы проделаем тоже, что было применено в выше идущем пункте.

Нам нужно перекодировать строку в windows-1251 применяем функцию substr, третьим значением ставим тот символ строки который хотим получить, и третьим шагом возвращаем кодировку строки.

Результат получения определенного символа строки:

если мы сейчас применим функцию mb_substr:

Для того, чтобы данная функция получила определенный символ строки, то нужно объявить кодировку внутри скрипта.

Результат получения символа строки с помощью mb_substr

Сообщение системы комментирования :

Форма пока доступна только админу. скоро все заработает. надеюсь.

Источник

Php ascii код символа

(PHP 4, PHP 5, PHP 7, PHP 8)

ord — Конвертирует первый байт строки в число от 0 до 255

Описание

Интерпретирует бинарное значение первого байта строки character как беззнаковое целое.

Если строка создана в однобайтовой кодировке, такой как ASCII, ISO-8859 или Windows 1252, результат функции будет эквивалентен позиции символа в соответствующей таблице кодировки. В любом случае, эта функция ничего не знает про кодировки и не сможет вернуть кодовую точку первого символа строки, закодированной в многобайтовой кодировке, такой как UTF-8 или UTF-16.

Список параметров

Возвращаемые значения

Целое число от 0 до 255.

Примеры

Пример #1 Пример использования ord()

Пример #2 Просмотр индивидуальный байтов строки UTF-8

Результат выполнения данного примера:

Смотрите также

User Contributed Notes 5 notes

this function convert UTF-8 string to RTF code string. I am using code of v0rbiz at yahoo dot com, thanks.

function cadena_rtf($txt)
<
$result = null;

Regarding character sets, and whether or not this is «ASCII». Firstly, there is no such thing as «8-bit ASCII», so if it were ASCII it would only ever return integers up to 127. 8-bit ASCII-compatible encodings include the ISO 8859 family of encodings, which map various common characters to the values from 128 to 255. UTF-8 is also designed so that characters representable in 7-bit ASCII are coded the same; byte values higher than 127 in a UTF-8 string represent the beginning of a multi-byte character.

A technically correct description would be «Returns an integer representation of the first byte of a string, from 0 to 255. For single-byte encodings such as (7-bit) ASCII and the ISO 8859 family, this will correspond to the first character, and will be the position of that character in the encoding’s mapping table. For multi-byte encodings, such as UTF-8 or UTF-16, the byte may not represent a complete character.»

The link to asciitable.com should also be replaced by one which explains what character encoding it is displaying, as «Extended ASCII» is an ambiguous and misleading name.

I did not found a unicode/multibyte capable ‘ord’ function, so.

For anyone who’s looking to convert full strings to map and back it’s pretty simple but takes some getting used to. the code below saves an hour of scrounging codes for beginners like myself.

Источник

Что нужно знать каждому разработчику о кодировках и наборах символов для работы с текстом, часть 2

Это вторая часть перевода статьи What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text, первая часть — тут.

Мой документ – полная чушь в любой кодировке!

Если последовательность бит не выглядит разумной(с точки зрения человека), то это случай, когда документ скорее всего был неверно сконвертирован в определенный момент. К примеру мы берем текст ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ, и, не придумав ничего лучше, сохраняем его в UTF-8. Текстовый редактор предположил, что он правильно прочитал текст с кодировкой Mac Roman и теперь его надо сохранить в другой кодировке. В конце концов, все эти символы валидны в Unicode. В смысле, в Unicode есть пункт для É, для G, и так далее. Так что мы просто сохраняем его в UTF-8:

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

Вот так теперь текст ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ представляется последовательностью бит UTF-8. Эта битовая последовательность совершенно оторвана от того, что было в изначальном документе. В какой бы кодировке мы не открывали эту последовательность, нам ни за что не видать исходный текст エンコーディングは難しくない. Он просто потерян. Его можно было бы восстановить, знай мы изначальную кодировку Shift-JIS и то, что мы расценили текст как Mac Roman, а затем сохранили его в UTF-8. Но такие чудеса редко встречаются.

Множество раз конкретная битовая последовательность оказывается неверной в конкретной кодировке. Если бы мы попытались открыть изначальный документ в ASCII, то увидели бы, что часть символов распозналась, а часть – нет. Программа, который вы пользуетесь, могла бы решить просто выбросить байты, которые не подходят под текущую кодировку, или заменить их на знаки вопроса. Или на специальный символ замены в Unicode: � (U+ FFFD). Если после процедуры изъятия неподходящих символов вы сохраните документ, то потеряете их навсегда.

Если вы неверно угадали кодировку, а потом сохранили ее еще в одну, то вы испортите документ. Можно пытаться исправить его, но эти попытки обычно успехом не оканчиваются. Магия с битовым сдвигом обычно остается неработающей магией: как мертвому припарки.

И как же правильно менять кодировки?

Это правда просто! Нужно знать кодировку конкретного кусочка текста(битовой последовательности) и применить ее для расшифровки. Это все, что нужно сделать. Если вы пишете программу, которая принимает от пользователя текст, определите в какой кодировке она будет это делать. Любое текстовое поле должно знать, в какой кодировке оно принимает данные. Для любого типа файла, который пользователь может загрузить в программу должна быть определена кодировка. Или должен существовать способ спросить об этом пользователя. Информацию может предоставлять формат файла или пользователь( большинство из них вряд ли знают, пока конечно не дочитают статью).

Если нужно перегнать текст из одной кодировки в другую, применяйте специальные инструменты. Конвертация – утомительный труд по сравнению двух кодовых страниц и решению, что символ 152 в кодировке А совпадает с символом 4122 в кодировке B с последующим изменением битов. Не нужно изобретать этот велосипед: в каждом распространенном языке программирования есть абстрактные от битов и кодовых страниц инструменты для конвертации текста из кодировки в кодировку.

character GB18030 encoding UTF-32 encoding
縧 10111111 01101100 00000000 00000000 01111110 00100111

Вот и все. Содержание строки в его человеческом понимании не изменилось, но теперь это правильная строка в UTF-32. Если вы продолжите работать с ней в UTF-32, у вас не будет никаких проблем с нечитаемыми символами. Однако, как мы обсуждали ранее, не все кодировки способны отображать все символы. Невозможно закодировать символ 縧 в любой из кодировок для европейских языков. И может случится нечто ужасное.

Все в Unicode

Именно поэтому не существует оправдания в 21 веке не использовать Unicode. Некоторые специализированные кодировки для европейских языков могут более производительны, чем Unicode для конкретных языков. Но пока вам не приходится работать с терабайтами специального текста(а это ОЧЕНЬ много), вам не о чем беспокоиться. Проблемы, вытекающие из-за несовместимости кодировок, гораздо страшнее, чем потерянный гигабайт. И этот аргумент станет только весомей с ростом и удешевлением хранения данных и ширины канала.

Если системе нужно работать с иными кодировками, сконвертируйте текст в Unicode прежде всего, и перегоните обратно, если его нужно куда-нибудь вывести. Иначе придется очень внимательно следить за каждым случаем обращения к данным и проводить необходимые конвертации, если это возможно без потери информации.

Счастливые случайности

У меня был сайт подключенный к БД. Мое приложение обрабатывала все как UTF-8 и в БД хранила его так, и все было супер, но когда я зашел в админку БД, я ничего не мог понять.
— анонимный быдлокодер

Возникают ситуации, когда кодировки обрабатываются неверно, но все по прежнему работает нормально. Часто бывает, что кодировка базы данных выставлена в latin-1, а приложение работает с UTF-8(или любой другой). Вобщем-то, любая комбинация 1 и 0 допустима в однобайтной latin-1. Если база данных получает от приложения данные вида 11100111 10111000 10100111, то оно с радостью сохраняет их, думая, что приложение имело ввиду 縧. Почему бы и нет? Позже бд возвращает те же самые биты приложению, которое счастливо, ведь получило символ UTF-8 縧, который и задумывался. Но интерфейс администрирования бд знает, что используется latin-1, и вот результат: ничего не возможно понять.
Глупец просто выиграл лотерею, хотя звезды были не на его стороне. Любая операция над текстом в бд может сработать, но может и выполниться не как задумано, так как бд неправильно воспринимает текст. В худшем случае, бд ненароком уничтожит весь текст, выполняя произвольную операцию 2 года спустя после установки из-за неверной кодировки(и конечно, никакого тебе бэкапа).

UTF-8 и ASCII

Гениальность UTF-8 в бинарной совместимости с ASCII, которая является де-факто основой для всех кодировок. Все символы ASCII занимают максимум байт в UTF-8 и используют те же биты, что и в ASCII. Иными словами, ASCII может быть отражено 1:1 в UTF-8. Любой символ не из ASCII занимает 2 или более байт в UTF-8. Большинство языков программирования, использующих ASCII в качестве кодировки исходного кода, позволяет включать текст в UTF-8 прямо в текст:

Сохранение в UTF-8 даст последовательность:

00100100 01110011 01110100 01110010 01101001 01101110 01100111 00100000
00111101 00100000 00100010 11100110 10111100 10100010 11100101 10101101
10010111 00100010 00111011

Только 12 байт из 17(те, что начинаются с 1) являются символами UTF-8(2 символа по 3 байта). Прочие символы находятся в ASCII. Парсер прочитает следующее:

$string = «11100110 10111100 10100010 11100101 10101101 10010111»;

Парсер воспринимает все за кавычкой как последовательность бит, которую нужно трактовать как есть, все, вплоть до другой кавычки. Если вы просто выведете эту последовательность, вы выведете текст в UTF-8. Не нужно делать ничего больше. Парсеру не нужно специально поддерживать utf-8, нужно просто воспринимать строки буквально. Простые парсеры могут поддерживать Unicode именно так, на самом деле не поддерживая Unicode. Однако многие языки программирования явно поддерживают Unicode.

Кодировки и PHP.

PHP не поддерживает Unicode. Правда, он поддерживает его достаточно хорошо. Предыдущий параграф показывает, как включать символы UTF-8 прямо в текст программы без каких-либо проблем, ибо UTF-8 обратно совместима с ASCII, и это все, что нужно PHP. Однако утверждение, что «PHP не поддерживает Unicode» истинно, ибо вызывает множество затруднений в сообществе PHP.

Ложные обещания

Одной моей мозолью стали функции utf8_encode и utf8_decode. Я часто вижу глупости наподобии «Чтобы использовать Unicode в PHP, нужно вызвать utf8_encode для вводимого текста и utf8_decode для выводимого». Эти две функции обещают некую автоматическую конвертацию текста UTF-8, которая якобы обязательна, ибо «PHP не поддерживает Unicode». Если вы читаете эту статью не по диагонали, то знаете, что

Поясню пункт 2: любой текст уже чем-то закодирован. Когда вы вставляете строки в исходный код, они уже имеют кодировку. Точнее, ту кодировку, которую сейчас использует ваш текстовый редактор. Если вы получаете их из бд, они уже закодированы. Если вы читаете их из файла… уже знаете, да?

Текст либо закодирован в UTF-8, либо не закодирован. Если нет, то он закодирован в ASCII, ISO-8859-1, UTF-16 или как-нибудь еще. Если он не в UTF-8, но предполагается, что он содержит «UTF-8 символы», то у вас когнитивный диссонанс. Если текст все же содержит нужные символы, закодированные в UTF-8, то он в UTF-8.

Так что же, черт возьми, делает utf8_encode?

«Переводит строку ISO-8859-1 в кодировку UTF-8»

Ага! Автор хотел сказать, что функция конвертирует текст из ISO-8859-1 в UTF-8. Вот она для чего. Такое ужасное название ей наверно дал какой-нибудь непредусмотрительный европеец. Тоже самое касается и utf8_decode. Эти функции неприменимы ни для чего, кроме конвертации из ISO-8859-1 в UTF-8. Если вам нужна другая пара кодировок, используйте iconv.
utf8_encode – это вам не волшебная палочка, которой нужно махать над каждым словом потому что «PHP не поддерживает Unicode». Она вызывает больше проблем, чем решает – скажите спасибо тому европейцу и невежам-программистам.

Нативный-шмативный

Так что имеют ввиду, когда говорят, что язык поддерживает Unicode? Важно, предполагает ли язык, что один символ занимает один байт, или нет. Так, PHP позволяет получить доступ до выбранного символа, трактуя строку как символьный массив:

Тоже касается и многих стандартных функций, таких как substr, strpos, trim и прочих. Поддержка прекращается там, где кончается соответствие между байтом и символом:

11100110 10111100 10100010 11100101 10101101 10010111
漢 字

php ascii код символа. image loader. php ascii код символа фото. php ascii код символа-image loader. картинка php ascii код символа. картинка image loader. Прежде чем приступить к изучению этого вопроса, рассмотрим, что такое ASCII-коды, для чего они применяются и почему получили широкое распространение.

$string[0] для указанной строки отдаст опять же только первый байт, равный 11100110. Другими словами, третий байт символа 漢. Последовательность 11100110 неверна для UTF-8, так что строка теперь тоже неверна. Если вам тоже так кажется, можете попробовать другую кодировку, в которой 11100110 будет каким-нибудь допустимым случайным символом. Можете веселиться, только не на боевом сервере.

Вот и все. «PHP не поддерживает Unicode» означает, что большинство функций в языке предполагают, что один байт равен одному символу, что ведет к обрезке многобайтных символов или неверному подсчету длины строки. Это не означает, что вы не можете использовать Unicode в PHP, или что любой текст надо прогонять через utf8_encode, или еще какую-нибудь глупость.

Употребление и злоупотребление обработкой ошибок PHP

Вся проблема (не-)поддержки Unicode в PHP в том, что интерпретатору плевать. Последовательности байт, ха. Нет дела до того, что они значат. Не делается ничего, кроме хранения строк в памяти. У PHP даже понятия такого нет – кодировка. И пока не нужно манипулировать строками, это и не важно. Делается работа с последовательностями байт, которые могут быть всопринятыми кем-то как символы. PHP требует от вас только сохранять исходный код в чем-нибудь, совместимом с ASCII. Парсер PHP ищет конкретные символы, которые говорят ему что делать. 00100100 говорит: «объяви переменную», 00111101 – «присвой», 00100010 – начало или конец строки и т.д. Все, что не важно парсеру, воспринимаются как литералы байтовых последовательностей. Это касается и всего, что заключено в кавычки. Это значит:

Обе строки Foobar должны иметь идентичное битовое представление. Если исходный код в ASCII, а локализционный – в UTF-16, вам не повезло. Нужно проводить дополнительную конвертацию.

Проницательный читатель может спросить, скажем, можно ли сохранить последовательно байт UTF-16 в литерал исходного файла в ASCII, и ответ будет всегда такой: конечно.

Если вы заставите свой редактор сохранить echo “ “ в ASCII, а UTF-16 в UTF-16, то все сработает. Вот бинарное представление:

01100101 01100011 01101000 01101111 00100000 00100010
e c h o »
11111110 11111111 00000000 01010101 00000000 01010100
(UTF-16 marker) U T
00000000 01000110 00000000 00101101 00000000 00110001
F — 1
00000000 00110110 00100010 00111011
6 » ;

Первая строка и последние 2 байта – из ASCII. Остальное представлено в UTF-16 2 байтами на символ. Ведущие 11111110 11111111 на второй строке – это маркер начала текста в UTF-16(требует по стандарту, PHP об этом ни черта не слышал). Этот скрипт выводит строку “UTF-16”, закодированную в UTF-16, потому что просто выводит байты между двух кавычек, что и выливается в текст «UTF-16», закодированный в UTF-16. C другой стороны, исходник не является полностью корректным ни в ASCII, ни в UTF-16, так что можете открыть редактор и повеселиться.

Итого

PHP поддерживает Unicode, или точнее, любую кодировку довольно точно до тех пор, пока вы можете заставить парсер выполнять его работу, а разработчика – понимать, что он делает. Нужно быть внимательным только при работе со строками: деление, удаление пробелов, подсчет и все другие операции, требующие работать с символами, а не байтами. Если ничего не делать со строками, кроме чтения и вывода, то вряд ли возникнут проблемы, которых нет в других языках.

Языки с поддержкой кодировок

Так что же тогда для языка значит поддерживать Unicode? Javascript например поддерживает Unicode. На самом деле любая строка в Javascript кодирована в UTF-8. И это единственная кодировка, с которой работает Javascript. Вам просто не получить в Javascript строку не в UTF-8. Javascript поклоняется Unicode в такой степени, что в ядре языка просто нет инструментов для работы с другой кодировкой. Раз уж Javascript чаще всего исполняется в браузере, у вас не возникает проблем: браузер способен исполнить тривиальную логику кодирования и декодирования ввода-вывода.

Прочие языки просто поддерживают кодировки. Внутренняя работа проводится в какой-то одной кодировке, часто в UTF-16. Но это значит, что им нужно подсказывать в какой кодировке текст, или они сами будут пытаться ее определить. Необходимо указывать в какой кодировке сохранен исходный код, в какой кодировке сохранен файл, который будет прочитан, в какой кодировке нужно осуществлять вывод. Язык проведет конвертацию налету, если будет указано, что нужно использовать Unicode. Они делают все то, что в PHP нужно делать в полуавтоматическом режиме где-то на втором плане. Не лучше и не хуже, чем в PHP, просто по-другому. Хорошая новость в том, что строковые функции наконец просто работают, и вам не нужно думать, содержит ли строка многобайтные символы или не содержат, какие функции выбирать для работы и прочие вещи, которые нужно было бы делать в PHP.

Дебри Unicode

Раз уж Unicode решает столько различных проблем и работает в множестве различных сценариев, приходится платить за это копанием в дебрях. К примеру, в стандарте Unicode содержится инфорация о решении таких проблем, как унификации иеороглифоф ЯКК. Множество символов, общих для Японии, Китая и Кореи, изображены немного по разному. Или проблемы конвертации символов из нижнего регистра в верхний, наоборот или туда-обратно, которая оказывается не всегда такой простой, как с кодировками западно-европейских языков. Некоторые символы могут быть представлены разными пунктами. Буква ö к примеру может быть представлена пунктом U+00F6(«ЛАТИНСКАЯ МАЛЕНЬКАЯ БУКВА О С ДИЕРЕЗИСОМ») или как два пункта U+006F(«МАЛЕНЬКАЯ БУКВА O») И U+0308(«ПОДСТАВЛЯЕМЫЙ ДИАРЕЗИС»), что значит буква o с ¨. В UTF-8 это либо 2 байта, либо 3 байта, которые в обоих случаях представляют собой нормальный символ. Поэтому есть правила нормализации в стандарте, т.е. как конвертировать эти формы из одной в другую. Это и многое другое находится вне материалов статьи, но об этих моментах нужно знать.

Опять ниасилил!

Теперь нечего оправдываться, когда вы вновь испортите текст.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *