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


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

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

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

14 Comments

  1. pbazeliuk

    Осталось только оптимизировать, подозреваю что не такая уж и быстрая конвертация.

    А неразрывный пробел правильно отработается? Код символа — 160.

    Reply
  2. Windsor77

    Ну не знаю, конечно. Не успел ещё замер производительности сделать, в ближайшее время хочется сравнить.

    Поскольку 1С-ка выдаёт настоящий код символа в Юникоде, а исключения из кодируемых составляют только указанные в спецификации символы (пробел, кстати, можно и исключить, но ведь стандарт подразумевает отображение в виде «+») — т.е. буквы латиницы, цифры и несколько знаков — остальные символы переводятся именно в соответствии с алгоритмом, суть которого примерно та же, что и Base64. Поэтому и неразрывный пробел должен совпасть. Вы не проверяли?

    Reply
  3. Windsor77

    Замер производительности показал, что 40-45% времени пожирает конвертер dec->hex…

    Reply
  4. ksb

    Подскажите несведущим чем Unicode отличается от UTF-8

    поему у них обоих ведь 2 байта на символ, что позволяет закодировать все вариации

    Reply
  5. andrewks

    (4) ksb, в юникод — 2 байта на символ. в utf-8 — от 1 и выше байт на символ (английские — 1, русские — 2, азиатские вообще по 3-4 занимают)

    Reply
  6. ksb

    (5) Пасиб. а ещё вопрос

    а как проги разбирают, что в потоке символов utf-8 этот символ займет 1 байт а другой 4 байта, они разделены каким то маркером ?

    Reply
  7. andrewks

    (6) ksb, тут тема раскрыта: http://ru.wikipedia.org/wiki/UTF-8

    🙂

    Reply
  8. AlX0id

    А если в Base64 загнать — не вариант?

    Reply
  9. Windsor77

    Конечно не вариант, ведь Base64 — это поток бинарной информации, тупо «порубленный» по 6 бит; с UTF-8 другая история, там зависимость нелинейная.

    Reply
  10. Windsor77

    Изменил способ конвертации Dec->Hex (берётся прямо из строки, значение — как индекс нужной пары символов), в результате прирост скорости около 60%.

    Reply
  11. Gida

    А символы @#$%#k8SjZc9Dxk&*() разве не являются безопасными? в статье из википедии пишут что сиволы 00-7F однозначно соответствуют ASCII

    Reply
  12. Windsor77

    (11) Gida, этот конвертер написан для использования в POST-запросах и URL, поэтому и диапазон «безопасных» символов сужен до разрешённого в URL-ах.

    Reply
  13. TUTSIC923

    русские символы я так понял , он не конвертирует …

    Reply
  14. Windsor77

    (13) Наоборот, конвертирует НЕ ТОЛЬКО русские символы, но и все остальные.

    Reply

Leave a Comment

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