atob/btoa и unicode
«javascript:alert(atob(btoa('йцукен')))» -> «9FC:5=»
Сие как-то лечится? P.S. Я в курсе существования полностью js-ных реализаций, но они не блещут скоростью. |
alert(unescape(atob(btoa(escape('йцукен'))))) |
Ясно, спасибо.
Другими словами, base64 рассчитано только на ASCII и при необходимости кодирования более широкого диапазона символов их следует явно привести к однобайтной кодировке. Другим вариантом было бы предварительное кодирование в utf8. |
Цитата:
|
С многобайтными кодировками не работает:
Цитата:
|
Разбить многобайтовые символы на несколько однобайтовых, закодировать.
При раскодировке собирать разбитые байты в один многобайтовый символ. |
Цитата:
|
var str = "Экс-граф, плюш изъят, бьём чуждый цен хвощ."; var matches = []; for (var i=0; i<str.length; i++){ var chr = str.charAt(i) matches.push(atob(btoa(chr)).charCodeAt(0) == chr.charCodeAt(0)%0x100); }; alert(matches.join("\r\n")); Opera 10.50: из многобайтной кодировки используется только самый младший байт. Firefox 3.5: метает ошибку. Internet Explorer 6: вообще такой функции не знает. |
Хех, действительно. Я увидел, что в Opera 10.5 добавили поддержку этого дела и решил попробовать. Но пробовал только там, в уверенности, что такая тривиальная вещь везде одинакова.
Мда, оперная реализация (как это периодически бывает) оказалась со странностями. Chrome, кстати, тоже выдаёт ошибку. |
Часовой пояс GMT +3, время: 08:04. |