Skip to main content
NewWebmaster.RU

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);
  });