Подтвердить что ты не робот

Строка UTF-8 неправильно декодирована в AngularJS

У меня есть текстовое поле ввода внутри SPA, построенного на AngularJS, для того, чтобы пользователи могли добавить заголовок к распечатке. Поле ввода объявляется следующим образом:

<input class="chart-title" type="text" ng-model="chartTitle" ng-change="titleChanged()"/>

Текстовое поле заполняется заголовком по умолчанию, предоставленным сервером. Пользователь может изменить заголовок на все, что им подходит. Когда название изменено, сервер обновляется и отправляет обратно новый заголовок в заголовок ответа, который затем заменяет заголовок в поле. Это отлично работает для стандартных символов типа ASCII.

Однако для символов Unicode (например, ßßçøö) это не работает. Текст отправляется правильно, правильно обновляется на сервере и правильно возвращается в SPA. Заголовки для запроса/ответа находятся здесь:

Request URL:http://blahblahblah/api/.....&chartTitle=Instrument:%20%C3%A0%C3%9F%C3%A9%C3%A7%C3%B8%C3%B6

Заголовки ответов:

chartTitle: Instrument: %C3%A0%C3%9F%C3%A9%C3%A7%C3%B8%C3%B6

Запрос выполняется с помощью AngularJS $http(). Поскольку вы можете видеть, что значения совпадают (пробел в запросе кодируется как %20 по очевидным причинам). Однако, когда я получаю заголовок, используя headers("charttitle"), значение, которое я получаю, составляет Instrument: àÃéçøö

Javascript-пакет объявлен в индексе с помощью charset utf-8:

<script src="/js/bundle.js" type="text/javascript" charset="UTF-8"></script>

Кроме того, html объявляется с правильной кодировкой, мне кажется в двух местах в объявлении главы:

<meta http-equiv="Content-Type" content="text/html charset=UTF-8" />
<meta charset="utf-8" />

Согласно этому сайту (http://www.i18nqa.com/debug/utf8-debug.html), похоже, что я получаю кодировку символов Windows1252. Это не имеет никакого смысла. Я мог бы, если это абсолютно необходимо, написать ужасный взлом, конвертирующий строку utf-8 в символы Windows1252, но это кажется немного экстремальным и довольно уязвимым для меня.

Эффект тот же, будь то в Chrome, Firefox или IE11. Полные заголовки запросов находятся здесь:

Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Connection:keep-alive
Host:blahblahblah
Origin:http://blahblahblah
Referer:http://blahblahblah/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36

Есть ли что-то, что я забыл? Все, что было забыто?

ИЗМЕНИТЬ

Полные ответные заголовки по запросу.

Access-Control-Allow-Origin:*
Access-Control-Expose-Headers:chartTitle
Cache-Control:private
chartTitle:Instrument: %C3%A0%C3%9F%C3%A9%C3%A7%C3%B8%C3%B6
Content-Disposition:attachment; filename=PrintData.pdf
Content-Length:1391643
Content-Type:application/octet-stream
Date:Fri, 20 Jan 2017 11:19:07 GMT
Server:Microsoft-IIS/10.0
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcR2l0XEVPU1xSZXZpZXdlci5XZWJcYXBpXFByaW50XGQyOTNkNjA4NWVlYzlhNTEwYjQ5YThmZGQxNjNhMjAwMWZhYTFjMGY5YzhiMzUxYzE5ZjYxYWMwYTY1OWVhMDM=?=

Код вокруг headers

$http({
    method: 'GET',
    url: filePath,
    params: {
        fileName: fileName
    },
    responseType: 'arraybuffer',
    headers: {'Content-Type' : 'application/json; charset=UTF-8'}
}).success(function (data, status, headers) {
    ready();
    if (status == 200) {
        var chartTitle = headers("charttitle");
        var printoutInformation = {'chartTitle' : chartTitle, 'pdfData' : data};
        deferred.resolve(printoutInformation);
    }
    else {
        deferred.resolve(null);
    }
    }).error(function (data) {
        ready();
        console.log(data);
    });
    return deferred.promise;

ИЗМЕНИТЬ

web.config для api также указывает utf-8:

    <globalization requestEncoding="utf-8" responseEncoding="utf-8"/>

TL; DR

В текстовом поле я хочу отобразить "Instrument àßéçøö", и вместо этого я вижу "Instrument: ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃ"

4b9b3361

Ответ 1

Вот ваша проблема решена.

Основываясь на этом источнике,

Отладка символов UTF-8 и ее кодирование и декодирование

Ответ, который вы получаете, является фактическим charecter кодированной строки utf-8

Итак, вам нужно декодировать это, чтобы получить результат.

HEre - это код для этого.

    decoded =  decodeURIComponent('%C3%A0%C3%9F%C3%A9%C3%A7%C3%B8%C3%B6')

    console.log(decoded);

   The result is => "àßéçøö"

, мы должны сделать это, чтобы получить фактическую строку вместо UTF-8

Итак, из вашего ответа вы получили à Ãéçøö

decodeURIComponent(escape("à Ãéçøö")) => "àßéçøö"

Определение:

decodeURIComponent():

  • Новая строка, представляющая декодированную версию данного кодированного компонента Uniform Resource Identifier (URI).

Итак, вот ваш метод.

if (status == 200) {
    var original = headers("charttitle");
    var chartTitle = decodeURIComponent(escape(original));
    console.log(chartTitle);
    var printoutInformation = {'chartTitle' : chartTitle, 'pdfData' : data};
    deferred.resolve(printoutInformation);
}

Теперь вы получите заголовки так же, как вы отправляете.

Ответ 2

Попробуйте ниже для кодирования

myAngApp1=document.getElementById("ItemSearch"); var uri = myAngApp1.value; var place = encodeURIComponent(uri)