我在一个基于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àßéçøö"而我正在看"仪器:ÃÃÃÃÃÃ"
这是你的问题解决了.
根据这个来源,
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("à Ãéçøö")) => "àßéçøö"
定义:
表示给定编码的统一资源标识符(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); }
现在,您将获得与发送时相同的标题.