当前位置:  开发笔记 > 编程语言 > 正文

在AngularJS中未正确解码UTF-8字符串

如何解决《在AngularJS中未正确解码UTF-8字符串》经验,为你挑选了1个好方法。

我在一个基于AngularJS构建的SPA中有一个文本输入框,供用户在打印输出中添加标题.输入框声明如下:


文本框中填充了服务器提供的默认标题.用户可以将标题更改为适合他们的标题.更改标题后,服务器将更新并在响应标题中发回新标题,然后替换框中的标题.这适用于标准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: àÃéçøö

使用charset utf-8在索引中声明javascript包:


另外html是用正确的字符集声明的,在我看来头部声明中的两个地方:



根据这个网站(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:

    

TL; DR

在一个文本框中,我想显示"Instrumentàßéçøö"而我正在看"仪器:ÃÃÃÃÃÃ"



1> Sravan..:

这是你的问题解决了.

根据这个来源,

UTF-8字符调试及其编码和解码

您得到的响应是编码的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():

表示给定编码的统一资源标识符(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);
}

现在,您将获得与发送时相同的标题.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有