Typescript JSON.parse 土耳其语字符转换问题 [重复]

Typescript JSON.parse turkish character conversion problem [duplicate]

提问人:emreertunc 提问时间:12/26/2022 最后编辑:emreertunc 更新时间:12/26/2022 访问量:222

问:

我有一个代码,可以解码 JWT 令牌,拆分包含声明的字符串部分并将该信息转换为 JSON 对象。

return JSON.parse(atob(token.split('.')[1])) as LoggedInUser;

它有效,但是当涉及到用户名时,由于它有一些土耳其字符,我得到一个带有不可读字符的字符串。在下图中,用户名为“Uğur Gül”。

wrongly formatted json object

我想我应该以某种方式使用 utf-8 格式进行解析,但找不到方法。我正在使用 angular 框架。如何解决此问题?

编辑:这是我在 jwt.io 上的模拟数据令牌的解码版本。我正在尝试从令牌中获取有效负载,就像 jwt.io 创建 JSON 对象的方式一样,并且我正在将所需值分配给 LoggedInUser 类的实例的相关字段。

jwt.io decoded version

javascript json angular angularjs 打字稿

评论

1赞 Flo 12/26/2022
数据来自后端?请在解析之前向我展示令牌数据。
0赞 emreertunc 12/26/2022
@Flo 是的,数据来自后端。刚刚编辑了我的问题。您可以检查它包含的示例数据。Token comes from backend 是一个长字符串,如下所示:“eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c”我得到第一个点之后的部分。这是有效载荷部分。
1赞 gog 12/26/2022
那是“John Doe”,向我们展示“Uğur Gül”
0赞 emreertunc 12/26/2022
@Flo这里是带有“Uğur Gül”“eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.”的 eyJVc2VySWQiOiIyIiwiVXNlckdpdmVuTmFtZSI6IlXEn3VyIEfDvGwiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiIyIiwiZXhwIjoxNjcyMDQ2Mzc1LCJpc3MiOiJodHRwczovL2xvY2FsaG9zdDo3MDEzLyIsImF1ZCI6Imh0dHBzOi8vbG9jYWxob3N0OjcwMTMvIn0.EERKwS2yfT6TnPJN4zlHyvW4WhrEMmaFLpUh0r8Ej70”

答:

-2赞 Flo 12/26/2022 #1

一种方法是后端/前端的名称。我不知道你的应用程序是如何工作的。escapeunescape

我们使用 和 Uğur Gül 将转换为 U%u011Fur%20G%FCl。将此项设置为 ,创建令牌并将其发送到前端。前端对其进行解码,给出名称并调用.所以你又有了正确的名字。escapeGivenUserNameunescape

样本:

data = '{"UserId":"2","UserGivenName":"U%u011Fur%20G%FCl","http://schemas.microsoft.com/ws/2008/06/identity/claims/role":"2","exp":1672046375,"iss":"https://localhost:7013/","aud":"https://localhost:7013/"}'

  constructor() {
    console.log((escape("Uğur Gül")));
    console.log(unescape(escape("Uğur Gül")))

    this.token = (btoa(this.data))
    const jsonData = JSON.parse(atob(this.token));
    console.log(unescape(jsonData.UserGivenName));
  }

重要

escape并标记为已弃用。您可以使用 and:unescapeencodeURIdecodeURI

    console.log(encodeURI('Uğur Gül'));
    console.log(decodeURI(encodeURI('Uğur Gül')));

这是一个 Stackblitz 可以玩。

评论

0赞 deceze 12/26/2022
这不仅不应该是必需的,而且还在不应使用的已弃用函数列表中。escape
0赞 Flo 12/26/2022
查看更新后的帖子
0赞 deceze 12/26/2022
更好,但是如果您需要处理的第三方为您提供 UTF-8 编码的字符串,它仍然不起作用。
0赞 Flo 12/26/2022
然后我们需要查看后端代码,它对字符串进行编码。没有它,这是一个可行的解决方案。
1赞 deceze 12/26/2022
如示例中所述,后端提供了一个完美的 UTF-8 编码的 JWT。这是 JS 中一个已知的“问题”,即将包含 UTF-8 编码文本的 base64 解码为字符串是......棘手。我把这个问题作为重复...