Как стать автором
Обновить

Комментарии 25

А что, на vbscript кто-то пишет?
На jscript, кстати, эти функции пишутся тривиально:

function utf8_decode (str) { return unescape(encodeURIComponent(str)); }
function utf8_encode (str) { return decodeURIComponent(escape(str)); }

* идея взята из комментария на phpjs.org
А почему минусуете? Субьективное мнение — тоже мнение!
Это хабр, детка.
) Ну тогда держитесь!
Завидуют, что в js проблема решается проще =))
Мне недавно как раз потребовалось автоматом перегонять текст из UTF8 в юникод, и я уже почти изобрёл велосипед, но наткнулся на маленькую утилиту uniconv, которая меня очень выручила.
Может кому-нибудь тоже пригодится.
«Символы же с кодами от 128 кодируются 2-мя байтами, с кодами от 2048 — 3-мя, от 65536 — 4-мя. Так можно было бы и до 6-ти байт дойти, но кодировать ими уже ничего.»

facepaw.jpg

1 байт — это 8 бит, следовательно максимальное число, записывание им равно 256 (2 в 8 степени), следовательно 2 байта — это 2 в 16 степени, или 65536. Следовательно 3 байта — это 65536*256 или 16777216.
Да, вот только запись числа, кодируемого 1 байтом информации, в шестнадцатиричном виде занимает 2 байта.
Если один байт полностью использовать под кодирование символа, то разобрать сколько их там еще осталось нельзя будет… Поэтому, если код символа больше 128, то он уже кодируется двумя байтами.
Посмотрите внимательно на схему преобразования. Некоторые биты в UTF-8 представлении символов являются вспомогательными, чтобы можно было при разборе данных понимать, сколько байт считывать для очередного символа.
да, уже прочитал. Минусуйте :)
Спасибо, неплохо написано. Что могу добавить:
Начало дублирует ANSII, а дальше остаток латиницы, кирилица, другие европейские и азиатские символы


Это не так, первые 255 unicode code points соответствуют Latin-1 а не ASCII.

Так можно было бы и до 6-ти байт дойти, но кодировать ими уже ничего.


Это не так. До 4-х байт UTF-16 обрезали для совместимости по ассортименту code points с UTF-16, это определено RFC3629. Более того, обрезано оно не до 4-х байт, а до 0x10FFFF code points, тоесть четвертый байт используется не целиком.
Ну вот… Начало хорошее, но дальше Википедии вы не дошли и получился не соответствующий стандарту Unicode велосипед. Почему? Например, потому что вы позволяете кодировать в UTF-8 старшие и младшие суррогаты. Также неправильно обрабатываются overlong sequences и ошибочные последовательности. Эти все вещи должны заменяться на специальный кодпоинт и производиться восстановление после ошибок строго так, как написано в стандарте.

Можете проверять свой декодировщик на тесте:
www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
Спасибо, учту. Поспешил конечно, первая статья моя. С суррогатами разберусь.
тест теперь проходит
На VBScript. У него даже побитовый сдвиг отсутствует :).
ничего не сказано про точки кода — базовое понятие utf.
забыл оставить это
Блин, это ж бейсик! Последний раз лет 15 назад его видел:)
Лучше и не видеть, но всякие задачи встают иногда :).
Практически ровно 3 года прошло, однако.

offtopic: «Так можно было бы и до 6-ти байт дойти, но кодировать ими уже ничего.»

в конце «нЕчего» ☺️

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории