Pull to refresh

Ajax и windows-1251

Описание вопроса


Внезапно, я обнаружил, что POST AJAX упорно передает мою строку в UTF-8, игнорируя все попытки указать ему кодировку. А серверные программы настроены принимать только windows-1251 и это вызывает некий конфликт. И выражается он в том, что русский текст становится текстом кракозябровым.

Некоторое время погуглив я обнаружил, что нормальное решение этой проблемы как-то не существует и основное мнение комъюнити показано, например, здесь, на Хабре. Краткое содержание: нельзя, потому что нельзя, используй перекодировку. Я же, со своей стороны решил, что вариант с удвоением трафика + потерей мощности меня не слишком радует, что и подвигло меня на написание этой статьи. Вопрос, в целом, частый, но, почему-то, так и не решенный. Не правильно это.

Дальнейшие раскопки привели меня к причинам такого поведения AJAX: W3. Там написано, что строку надо передавать в UTF-8 и ничего больше не волнует. Но что более интересно, там сказано, что другие варианты можно передавать и не как UTF-8. Например: ArrayBuffer или Blob.
Покопав в этом направление, я нашел еще одну статью, где эти возможности описываются. Этот вариант относится к новым возможностям, появившимся относительно недавно. Исходя из всей этой информации, я вывел решение.

Решение:


1) Берем нашу строку data_str и какой-либо функцией меняем ее кодировку на нужную(в моем случае — это windows-1251). Такую функцию легко написать самому или найти на просторах сети.
var converted_str = convertToWin1251(data_str);

2) Мы получили converted_str, которая все еще считается строкой в UTF-8, но содержит уже коды необходимой кодировки. Просто так послать ее нельзя, ибо AJAX все равно будет трактовать ее, как UTF-8 и попытается конвертировать, что окончательно ее испортит.
Поэтому, мы создаем массив 8мибайтовых неотрицательных чисел размером под нашу строку:
var send_arr = new Uint8Array(converted_str.length);

3) Теперь осталось только заполнить этот массив
for(var i = 0; i < converted_str .length; ++i)
send_arr[i] = converted_str.charCodeAt(i);

4) выставить правильную кодировку и отправить его:
ajaxVar.setRequestHeader('Content-Type', 'text/plain; charset=windows-1251');
ajaxVar.send(b);

Собственно, все.

Надеюсь, это кому-то помогло. Удачи!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.