Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   atob/btoa и unicode (https://javascript.ru/forum/misc/9418-atob-btoa-i-unicode.html)

Lexi 15.05.2010 15:03

atob/btoa и unicode
 
«javascript:alert(atob(btoa('йцукен')))» -> «9FC:5=»

Сие как-то лечится?

P.S. Я в курсе существования полностью js-ных реализаций, но они не блещут скоростью.

Octane 15.05.2010 15:41

alert(unescape(atob(btoa(escape('йцукен')))))

Lexi 15.05.2010 16:18

Ясно, спасибо.

Другими словами, base64 рассчитано только на ASCII и при необходимости кодирования более широкого диапазона символов их следует явно привести к однобайтной кодировке. Другим вариантом было бы предварительное кодирование в utf8.

Octane 15.05.2010 16:39

Цитата:

Сообщение от Lexi
Другими словами, base64 рассчитано только на ASCII

Base64 кодирует последовательность байт в последовательность печатных ASCII-символов, поэтому алгоритму все равно, что на входе, ведь оно представлено в виде последовательности байт. Тут скорее всего проблема в том, что функции atob и btoa отдают алгоритму.

e1f 15.05.2010 18:10

С многобайтными кодировками не работает:
Цитата:

Сообщение от http://www.nczonline.net/blog/2009/12/08/computer-science-in-javascript-base64-encoding/
Before even attempting to base64 encode a string, you should check to see if the string contains only ASCII characters. Since base64 encoding requires eight bits per input character, any character with a code higher than 255 cannot be accurately represented. The specification indicates that an error should be thrown in this case


B@rmaley.e><e 15.05.2010 19:04

Разбить многобайтовые символы на несколько однобайтовых, закодировать.
При раскодировке собирать разбитые байты в один многобайтовый символ.

Kolyaj 15.05.2010 20:20

Цитата:

Сообщение от e1f
С многобайтными кодировками не работает:

Не с кодировками, а с символами, коды которых больше 255. Большие уже нужно кодировать, а в какую кодировку -- функция решать не может. Это должен решать программист. Поэтому то, что сказал B@rmaley.e><e.

subzey 16.05.2010 01:47

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: вообще такой функции не знает.

Lexi 16.05.2010 12:37

Хех, действительно. Я увидел, что в Opera 10.5 добавили поддержку этого дела и решил попробовать. Но пробовал только там, в уверенности, что такая тривиальная вещь везде одинакова.
Мда, оперная реализация (как это периодически бывает) оказалась со странностями.

Chrome, кстати, тоже выдаёт ошибку.


Часовой пояс GMT +3, время: 01:49.