gifts2017

Кодирование строки из Unicode в UTF-8

Опубликовал Роман (Windsor77) в раздел Обмен - Интеграция с WEB

Мой вариант обработки не использует никаких внешних компонент, при этом кодирование учитывает полную спецификацию UTF-8. Таким образом, в отличие от представленных здесь аналогов, можно преобразовывать не только кириллицу, а любой текст в юникоде.

В поисках решения проблемы передачи в POST/GET-запросы не-ASCII текста из 1С, так и не смог найти универсальной и алгоритмически красивой версии. Поэтому скромно представляю на ваш суд свой вариант.

upd: Изменил способ конвертации Dec->Hex, в результате прирост скорости около 60%.

Скачать файлы

Наименование Файл Версия Размер
Строка из Unicode в UTF-8 (быстрое Dec->Hex) 79
.epf 7,18Kb
31.01.13
79
.epf 7,18Kb Скачать
Строка из Unicode в UTF-8 26
.epf 6,75Kb
31.01.13
26
.epf 6,75Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Baza (pbazeliuk) 30.01.13 20:12
Осталось только оптимизировать, подозреваю что не такая уж и быстрая конвертация.

А неразрывный пробел правильно отработается? Код символа - 160.
2. Роман (Windsor77) 30.01.13 23:46
Ну не знаю, конечно. Не успел ещё замер производительности сделать, в ближайшее время хочется сравнить.

Поскольку 1С-ка выдаёт настоящий код символа в Юникоде, а исключения из кодируемых составляют только указанные в спецификации символы (пробел, кстати, можно и исключить, но ведь стандарт подразумевает отображение в виде "+") - т.е. буквы латиницы, цифры и несколько знаков - остальные символы переводятся именно в соответствии с алгоритмом, суть которого примерно та же, что и Base64. Поэтому и неразрывный пробел должен совпасть. Вы не проверяли?
3. Роман (Windsor77) 31.01.13 01:00
Замер производительности показал, что 40-45% времени пожирает конвертер dec->hex...
4. ksb (ksb) 31.01.13 07:26
Подскажите несведущим чем Unicode отличается от UTF-8
поему у них обоих ведь 2 байта на символ, что позволяет закодировать все вариации
5. andrewks 31.01.13 07:45
(4) ksb, в юникод - 2 байта на символ. в utf-8 - от 1 и выше байт на символ (английские - 1, русские - 2, азиатские вообще по 3-4 занимают)
6. ksb (ksb) 31.01.13 09:12
(5) Пасиб. а ещё вопрос
а как проги разбирают, что в потоке символов utf-8 этот символ займет 1 байт а другой 4 байта, они разделены каким то маркером ?
7. andrewks 31.01.13 09:17
8. Алексей 1 (AlX0id) 31.01.13 10:23
А если в Base64 загнать - не вариант?
9. Роман (Windsor77) 31.01.13 10:45
Конечно не вариант, ведь Base64 - это поток бинарной информации, тупо "порубленный" по 6 бит; с UTF-8 другая история, там зависимость нелинейная.
10. Роман (Windsor77) 31.01.13 11:47
Изменил способ конвертации Dec->Hex (берётся прямо из строки, значение - как индекс нужной пары символов), в результате прирост скорости около 60%.
11. Александр Гыдилика (Gida) 05.02.13 12:30
А символы @#$%^&*() разве не являются безопасными? в статье из википедии пишут что сиволы 00-7F однозначно соответствуют ASCII
12. Роман (Windsor77) 30.04.13 12:34
(11) Gida, этот конвертер написан для использования в POST-запросах и URL, поэтому и диапазон "безопасных" символов сужен до разрешённого в URL-ах.