Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.05.2010, 15:03
Интересующийся
Отправить личное сообщение для Lexi Посмотреть профиль Найти все сообщения от Lexi
 
Регистрация: 14.03.2009
Сообщений: 29

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

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

P.S. Я в курсе существования полностью js-ных реализаций, но они не блещут скоростью.
Ответить с цитированием
  #2 (permalink)  
Старый 15.05.2010, 15:41
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

alert(unescape(atob(btoa(escape('йцукен')))))
Ответить с цитированием
  #3 (permalink)  
Старый 15.05.2010, 16:18
Интересующийся
Отправить личное сообщение для Lexi Посмотреть профиль Найти все сообщения от Lexi
 
Регистрация: 14.03.2009
Сообщений: 29

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

Другими словами, base64 рассчитано только на ASCII и при необходимости кодирования более широкого диапазона символов их следует явно привести к однобайтной кодировке. Другим вариантом было бы предварительное кодирование в utf8.
Ответить с цитированием
  #4 (permalink)  
Старый 15.05.2010, 16:39
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от Lexi
Другими словами, base64 рассчитано только на ASCII
Base64 кодирует последовательность байт в последовательность печатных ASCII-символов, поэтому алгоритму все равно, что на входе, ведь оно представлено в виде последовательности байт. Тут скорее всего проблема в том, что функции atob и btoa отдают алгоритму.
Ответить с цитированием
  #5 (permalink)  
Старый 15.05.2010, 18:10
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

С многобайтными кодировками не работает:
Сообщение от 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
Ответить с цитированием
  #6 (permalink)  
Старый 15.05.2010, 19:04
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Разбить многобайтовые символы на несколько однобайтовых, закодировать.
При раскодировке собирать разбитые байты в один многобайтовый символ.
Ответить с цитированием
  #7 (permalink)  
Старый 15.05.2010, 20:20
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от e1f
С многобайтными кодировками не работает:
Не с кодировками, а с символами, коды которых больше 255. Большие уже нужно кодировать, а в какую кодировку -- функция решать не может. Это должен решать программист. Поэтому то, что сказал B@rmaley.e><e.
Ответить с цитированием
  #8 (permalink)  
Старый 16.05.2010, 01:47
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

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: вообще такой функции не знает.
Ответить с цитированием
  #9 (permalink)  
Старый 16.05.2010, 12:37
Интересующийся
Отправить личное сообщение для Lexi Посмотреть профиль Найти все сообщения от Lexi
 
Регистрация: 14.03.2009
Сообщений: 29

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

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

Последний раз редактировалось Lexi, 16.05.2010 в 12:47.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
alert и Unicode 4 faiq Общие вопросы Javascript 12 06.12.2009 03:15
перекодирование url из koi8 и cp1251 в unicode Birukoff Ваши сайты и скрипты 1 19.07.2009 05:22
RegExp и unicode Yury900 Общие вопросы Javascript 7 13.05.2008 00:19