[Moscow.pm] utf8:all vs json

Maxim Vuets maxim.vuets на gmail.com
Ср Апр 1 04:30:34 PDT 2015


2015-04-01 12:54 GMT+02:00 Nick Knutov <mail на knutov.com>:
> $json = $json->utf8 ([$enable])
...
> Видимо, я неправильно понимал что есть utf8 encoded string - по этому
> описанию получается, это utf8 encoded string есть последовательность
> байтиков без флага utf8 (и тесты с utf8::is_utf8 это предположение
> подтверждают).

Верно. И не просто байтиков, а UTF-8 байтиков. Из другого места той же
документации:

    $json_text = encode_json $perl_scalar
    Converts the given Perl data structure to a UTF-8 encoded,
**binary string (that is, the string contains octets only)**.

> Почему это называется "encode the JSON result into UTF-8" когда оно наоборот
> в байтики?

Правило № 0: не путайте UTF-8, Unicode, машинное и человеческое представление.

Потому что UTF-8 это *кодировка*. Кодировка описывает как что-то
осмысленное и человеческое *закодировать* в машино-варимое.

CP-1251 это кодировка (в том числе). И KOI8-R. И так называемый
Latin-1. И десятки других. А буква "щ" -- она везде одна. Но компьютер
не имеет понятия букв. Потому концепцию буквы нужно закодировать в
электронное представление при помощи бит, байт или слов.

В CP-1251 это будет 11111001, в KOI8-R --- 11011101, в UTF-8 ---
1101000110001001, в UTF16LE --- 0100100100000100. А в Latin-1
концепция буквы "щ" не существует в принципе.

Теперь о Перле. Как Перл хранит (кодирует) внутри себя буквы --- вас,
практически, никогда не должно интересовать. (Я даже рекомендую забыть
об этом до тех, пока вы не столкнётесь с жуткими проблемами
производительности, которые больше никак нельзя решить.)

Что вас должно интересовать --- это в какой машинной кодировке вам
приходят данные в программу. Т.е. что бы вы знали как *декодировать*
11011101. Компьютеру (и Перлу) безразлично --- семантику и смысл
вкладываете вы. После этого считайте, что внутри происходит магия:
Перл работает с текстом так, как вы хотите.

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

Много бед происходит из-за того, что Перл отдаёт наружу много
служебных функций типа utf8::is_utf8(). И по-моему, это неудачное
название.


Подробная информация о списке рассылки Moscow-pm