Текстовые поля в управляющих пакетах, описанных ниже, кодируются как строки UTF-8. UTF-8 [2] - эффективный метод кодирования символов Unicode [5], который оптимизирует кодовую таблицу ASCII для поддержки обмена текстовыми сообщениями.
Каждой из этих строк предшествует префикс длиной в два байта, который определяет количество байтов в самой кодированной строке UTF-8, как приведено в таблице 1. Следовательно, существует ограничение на размер строки, которая может быть передана в одном из этих кодированных компонентов UTF-8; невозможно передать строку размером более 65535 байт.
Если не указано иное, все кодированные строки UTF-8 могут иметь любую длину в диапазоне от 0 до 65535 байт.
Таблица 1 - Структура кодированных строк UTF-8
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Байт 1 | Длина строки MSB | |||||||
Байт 2 | Длина строки LSB | |||||||
Байт 3... | Данные закодированного символа UTF-8, если длина >0 |
Символьные данные в кодированной строке UTF-8 ДОЛЖНЫ быть правильно сформированы, как определено спецификацией Unicode [5] и подтверждено в RFC 3629 [2]. В частности, эти данные НЕ ДОЛЖНЫ включать кодовые точки между U+D800 и U+DFFF. Если Сервер или Клиент получает управляющий пакет, содержащий неправильно сформированный UTF-8, он ДОЛЖЕН прервать сетевое подключение [MQTT-4.5.3-1].
Закодированная строка UTF-8 НЕ ДОЛЖНА включать кодировку нулевого символа U+0000. Если получатель (Сервер или Клиент) получает управляющий пакет, содержащий U+0000, он ДОЛЖЕН прервать сетевое соединение [MQTT-4.5.3-2].
В данные НЕ СЛЕДУЕТ включать кодовые пункты Unicode [5], перечисленные ниже. Если получатель (Сервер или Клиент) получает управляющий пакет, содержащий любой из них, он МОЖЕТ прервать сетевое соединение:
- управляющие символы U+0001..U+001F;
- управляющие символы U+007F..U+009F;
- кодовые точки, которые согласно спецификации Unicode [5] не являются символами (например, U+0FFFF).
Кодированная UTF-8 последовательность 0xEF 0хВВ 0xBF всегда должна интерпретироваться как U+FEFF ("НЕРАЗРЫВНЫЙ ПРОБЕЛ С НУЛЕВОЙ ШИРИНОЙ"), где бы она ни появлялась в строке, и НЕ ДОЛЖНА быть пропущена или удалена получателем пакета [MQTT-1.5.3-3].
Пример - Строка А, которая представлена ЗАГЛАВНОЙ ЛАТИНСКОЙ БУКВОЙ А, за которой следует кодовая точка U+2A6D4 (представляющей ИДЕОГРАФИЧЕСКОЕ РАСШИРЕНИЕ CJK символ В), кодируется следующим образом, приведенным в таблице 2.
Таблица 2 - Пример строки в кодировке UTF-8
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Байт 1 | Длина строки MSB (0x00) | |||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
Байт 2 | Длина строки LSB (0x05) | |||||||
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | |
Байт 3 | 'А' (0x41) | |||||||
0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | |
Байт 4 | (0xF0) | |||||||
1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | |
Байт 5 | (0хАА) | |||||||
1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | |
Байт 6 | (0x9В) | |||||||
1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | |
Байт 7 | (0x94) | |||||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |