当前位置: 首页 > 面试题库 >

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

汪晨
2023-03-14
问题内容

我在AngularJS上建立的SPA中有一个文本输入框,供用户向打印输出中添加标题。输入框的声明如下:

<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束在索引中用字符集utf-8声明:

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

另外,用正确的字符集声明了html,在我看来,head声明中有两个地方:

<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:ÃÃéçøö¶”


问题答案:

这是您解决的问题。

根据这个来源,

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

您得到的响应是已编码的utf-8字符串的实际字符

因此,您需要对它进行解码才能得到结果。

这里是执行此操作的代码。

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

    console.log(decoded);

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

我们必须这样做以获得实际的字符串而不是UTF-8

所以,从您的回应中,à Ãéçøö

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

定义:

encodeURIComponent():

  • 一个新字符串,代表给定编码统一资源标识符(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);
}

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



 类似资料:
  • 问题内容: 如何使用Android解码utf-8字符串?我尝试使用此命令,但输出与输入相同: 问题答案: 字符串不需要编码。它只是一个Unicode字符序列。 要将字符串转换为字节序列时需要进行 编码 。您选择的字符集(UTF-8,cp1255等)确定了Character-> Byte映射。请注意,字符不必转换为单个字节。在大多数字符集中,大多数Unicode字符都转换为至少两个字节。 字符串的编

  • 问题内容: 我正在使用Javascript 函数解码base64编码的字符串(特别是来自GitHubAPI的base64编码的内容)。问题是我回来了ASCII编码的字符(而不是)。如何正确处理传入的以base64编码的流,以便将其解码为utf-8? 问题答案: 此问题: “ Unicode问题”由于s是16位编码的字符串,因此在大多数浏览器中,如果字符超出8位字节的范围(0x00〜0xFF),则调

  • 我正在使用Javascript函数来解码一个base64编码的字符串(特别是GitHub API中base64编码的内容)。问题是我得到了ASCII编码的字符(像而不是)。如何正确处理传入的base64编码的流,以便将其解码为UTF-8?

  • 问题内容: 我有一个使用ncurses用C编写的程序。它让用户输入并显示它。如果用户输入utf8字符,它将无法正确显示。 我将输入的字符用户保存到文件中。而且我直接在Shell中将此文件正确显示。 我搜索了stackoverflow和google,并尝试了几种方法(例如与ncursesw链接)显示不正确。 我: 可以正确显示用户输入的内容。 如何使ncurses正确显示UTF-8字符? 使用ncu

  • 问题内容: 因此,我有一个字符串数组,所有字符串都使用系统默认的 ANSI 编码,并从SQL数据库中提取。因此,存在256个不同的可能字符字节值(单字节编码)。 有没有一种方法可以使我工作并显示这些字符,而不必在我的所有字符串上使用并最终得到类似的东西? 还是这是JSON的标准? 问题答案: 有没有一种方法可以使json_encode()工作并显示这些字符,而不必在所有字符串上都使用utf8_en

  • 问题内容: 我遇到了这行遗留代码,我试图找出这些遗留代码: 据我了解,它是使用相同的charSet进行编码和解码。 这与以下内容有何不同? 在任何情况下,两条生产线的输出将不同? ps:只是要澄清一下,是的,我知道Joel Spolsky撰写的关于编码 的出色文章! 问题答案: 这可能是很复杂的方式 这缩短了String,而所使用的基础char []则更长。 但是,更具体地说,将检查每个字符是否都