Описание вопроса
Внезапно, я обнаружил, что 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);
Собственно, все.
Надеюсь, это кому-то помогло. Удачи!