Javascript декодирование кодировки win-1251 после fetch
Предположим наше приложение на одном домене обращается через Fetch API
к другому домену и запрашивает данные с него в виде строки текста.
let request = fetch(url)
.then(response => response.text())
.then(handleText);
Сервер, который отдает данные имеет кодировку win-1251, в следствие чего мы получаем в ответ "кракозябры" ибо метод Response.text()
который мы используем всегда обрабатывает ответ в UTF-8.
Конечно более правильным было бы изменить кодировку на сервере, ибо отдавать данные в win-1251 в наше время считается за моветон. Но так как не всегда есть такая возможность рассмотрим вариант обработки имеющихся данных.
Посмотреть кодировку на сервере вы всегда можете в заголовках HTTP ответа, а именно в Content-Type
:. В нашем случае это выглядело так:
Content-Type: text/html; charset=WINDOWS-1251
Из чего видно что это типичная для нашей страны кодировка "из 90-х" - windows-1251
а нам для дальнейшей цепочки обработки нужна UTF-8, чтож будет декодировать самостоятельно.
Для этого воспользуемся TextDecoder
классом, он может декодировать ArrayBuffer
в нужную кодировку, в итоге наш код будет выглядеть примерно так:
let request = fetch(url)
.then(response => response.arrayBuffer())
.then(buffer => {
let decoder = new TextDecoder("windows-1251");
let text = decoder.decode(buffer);
handleText(text);
});