Dav*_*tty 12 javascript string utf-8 character-encoding angularjs
我在一个基于AngularJS构建的SPA中有一个文本输入框,供用户在打印输出中添加标题.输入框声明如下:
<input class="chart-title" type="text" ng-model="chartTitle" ng-change="titleChanged()"/>
Run Code Online (Sandbox Code Playgroud)
文本框中填充了服务器提供的默认标题.用户可以将标题更改为适合他们的标题.更改标题后,服务器将更新并在响应标题中发回新标题,然后替换框中的标题.这适用于标准ASCII类型字符.
但是,对于unicode字符(例如àßéçøö),它不起作用.文本正确发送,在服务器上正确更新,并正确返回到SPA.请求/响应的标头位于:
Request URL:http://blahblahblah/api/.....&chartTitle=Instrument:%20%C3%A0%C3%9F%C3%A9%C3%A7%C3%B8%C3%B6
Run Code Online (Sandbox Code Playgroud)
响应标题:
chartTitle: Instrument: %C3%A0%C3%9F%C3%A9%C3%A7%C3%B8%C3%B6
Run Code Online (Sandbox Code Playgroud)
该请求是使用AngularJS进行的$http().正如您所看到的那样,值匹配(请求中的空格代码出于%20显而易见的原因).但是,当我检索标题时,使用headers("charttitle"),我收到的值是Instrument: à Ãéçøö
使用charset utf-8在索引中声明javascript包:
<script src="/js/bundle.js" type="text/javascript" charset="UTF-8"></script>
Run Code Online (Sandbox Code Playgroud)
另外html是用正确的字符集声明的,在我看来头部声明中的两个地方:
<meta http-equiv="Content-Type" content="text/html charset=UTF-8" />
<meta charset="utf-8" />
Run Code Online (Sandbox Code Playgroud)
根据这个网站(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
Run Code Online (Sandbox Code Playgroud)
有什么我遗漏的吗?有什么东西被遗忘了吗?
编辑
请求的完整响应标头.
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=?=
Run Code Online (Sandbox Code Playgroud)
代码围绕着 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;
Run Code Online (Sandbox Code Playgroud)
编辑
在web.config该API还指定UTF-8:
<globalization requestEncoding="utf-8" responseEncoding="utf-8"/>
Run Code Online (Sandbox Code Playgroud)
TL; DR
在一个文本框中,我想显示"Instrumentàßéçøö"而我正在看"仪器:ÃÃÃÃÃÃ"
Sra*_*van 10
这是你的问题解决了.
根据这个来源,
您得到的响应是编码的utf-8字符串的实际字符
因此,您需要对其进行解码才能获得结果.
HEre是执行此操作的代码.
decoded = decodeURIComponent('%C3%A0%C3%9F%C3%A9%C3%A7%C3%B8%C3%B6')
console.log(decoded);
The result is => "àßéçøö"
Run Code Online (Sandbox Code Playgroud)
我们必须这样做才能得到实际的字符串而不是UTF-8
所以,根据你的回答,à Ãéçøö
decodeURIComponent(escape("à Ãéçøö")) => "àßéçøö"
定义:
所以,这是你的方法.
if (status == 200) {
var original = headers("charttitle");
var chartTitle = decodeURIComponent(escape(original));
console.log(chartTitle);
var printoutInformation = {'chartTitle' : chartTitle, 'pdfData' : data};
deferred.resolve(printoutInformation);
}
Run Code Online (Sandbox Code Playgroud)
现在,您将获得与发送时相同的标题.