javascript - 在php中解码西里尔字母base64

标签 javascript php

我有一个来自 JavaScript 的 base64 编码 JSON 字符串,其中包含部分西里尔文字。我将其发送到服务器并想要解码 base64,但这给了我一个奇怪的结果。

字符串:

    eyJuYW1lT3JkZXIiOlsicHJvcGVydHlpZCIsInByb2plY3RuYW1lIiwiZW52aXJvbm1lbnQiLCJ2YXJpYWJsZSIsInZhbHVlIiwiY29tcG9uZW50IiwidXNhZ2UiLCJhY2Nlc3N0eXBlIiwidmVyc2lvbiIsImxhbmd1YWdlIl0sInBhcmFtZXRlcnMiOlsiNjg1IiwiRGVtbyIsInByb2QiLCJsYWkiLCJ2YWx1ZdCG0L3QtNC10LrRgSDQm9C40YHRgtC+0LLQvtGXINCf0L7QstC10YDRhdC90ZYgKC0pIiwiVHJhbnNsYXRpb24iLCJOT1RUUkFOU0xBVEVEIiwid3JpdGUiLCIwLjQuMCIsInVrIl19

我按如下方式生成此字符串:

btoa(unescape(encodeURIComponent(JSON.stringify(array))))

预期结果:

{  
   "nameOrder":[  
      "propertyid",
      "projectname",
      "environment",
      "variable",
      "value",
      "component",
      "usage",
      "accesstype",
      "version",
      "language"
   ],
   "parameters":[  
      "685",
      "Demo",
      "prod",
      "lai",
      "valueІндекс Листової Поверхні (-)",
      "Translation",
      "NOTTRANSLATED",
      "write",
      "0.4.0",
      "uk"
   ]
}

结果(正常base64_decode函数):

{"nameOrder":
[    "propertyid",
     "projectname",
     "environment",
     "variable",
     "value",
     "component",
     "usage",
     "accesstype",
     "version",
     "language"
 ],
 "parameters":
 [   "685",
     "Demo",
     "prod",
     "lai",
     "valueІндекс Листд,ԯեȴ'��ԭt`4at/teȊJHˈ՜ٛݛ][ۈˈӓՕѓՓUQˈޜ۝Hˈ̋͋̈ˈޚȗ_

好的,我发现了一些东西!
当我使用 $_GET 从 url 获取字符串时,它会发生变化。我认为这就是问题所在。我该怎么做才能从 url 中获取正确的字符串?

最佳答案

TLDR - 编码数据很好,您只是在不需要 UTF-8 的上下文中显示它。

在处理编码问题时,我发现牢牢掌握编码的工作原理非常有用,这样您就可以深入研究十六进制转储以消除任何错误配置输出的可能性......

所以,这是 Base64 解码数据的转储

00000000  7b 22 6e 61 6d 65 4f 72  64 65 72 22 3a 5b 22 70  |{"nameOrder":["p|
00000010  72 6f 70 65 72 74 79 69  64 22 2c 22 70 72 6f 6a  |ropertyid","proj|
00000020  65 63 74 6e 61 6d 65 22  2c 22 65 6e 76 69 72 6f  |ectname","enviro|
00000030  6e 6d 65 6e 74 22 2c 22  76 61 72 69 61 62 6c 65  |nment","variable|
00000040  22 2c 22 76 61 6c 75 65  22 2c 22 63 6f 6d 70 6f  |","value","compo|
00000050  6e 65 6e 74 22 2c 22 75  73 61 67 65 22 2c 22 61  |nent","usage","a|
00000060  63 63 65 73 73 74 79 70  65 22 2c 22 76 65 72 73  |ccesstype","vers|
00000070  69 6f 6e 22 2c 22 6c 61  6e 67 75 61 67 65 22 5d  |ion","language"]|
00000080  2c 22 70 61 72 61 6d 65  74 65 72 73 22 3a 5b 22  |,"parameters":["|
00000090  36 38 35 22 2c 22 44 65  6d 6f 22 2c 22 70 72 6f  |685","Demo","pro|
000000a0  64 22 2c 22 6c 61 69 22  2c 22 76 61 6c 75 65 d0  |d","lai","value.|
000000b0  86 d0 bd d0 b4 d0 b5 d0  ba d1 81 20 d0 9b d0 b8  |........... ....|
000000c0  d1 81 d1 82 d0 be d0 b2  d0 be d1 97 20 d0 9f d0  |............ ...|
000000d0  be d0 b2 d0 b5 d1 80 d1  85 d0 bd d1 96 20 28 2d  |............. (-|
000000e0  29 22 2c 22 54 72 61 6e  73 6c 61 74 69 6f 6e 22  |)","Translation"|
000000f0  2c 22 4e 4f 54 54 52 41  4e 53 4c 41 54 45 44 22  |,"NOTTRANSLATED"|
00000100  2c 22 77 72 69 74 65 22  2c 22 30 2e 34 2e 30 22  |,"write","0.4.0"|
00000110  2c 22 75 6b 22 5d 7d                              |,"uk"]}|
00000117

让我们解码单词 value 之后的序列 - 它看起来像有效的 UTF-8。因此我们可以将其分解为这些编码字符

d0 86
d0 bd 
d0 b4 
d0 b5 
d0 ba 
d1 81 
20 
d0 9b 
d0 b8 
d1 81 
d1 82 
d0 be 
d0 b2 
d0 be 
d1 97 
20 
d0 9f 
d0 be 
d0 b2 
d0 b5 
d1 80 
d1 85 
d0 bd 
d1 96 
20 
28 
2d
29

仅将第一个作为完整性检查,二进制序列 d0 861101 0000 1000 0110 - 这是有效的 UTF-8 2 byte sequence因为第一个字节以 110 开头,第二个字节以 10 开头 - 从其余数字中我们可以提取二进制值 100 0000 0110 code> 或 0x406 - 这是 Cyrllic character

所以看起来不错。而且,事实证明,这很好!如果我在 php 中对其进行 json_decode,并在为 UTF-8 设置的控制台中 var_dump 结果数据,那么对我来说看起来不错。

所以一切都很好 - 您正在某个不需要 UTF-8 编码文本的地方显示数据。

关于javascript - 在php中解码西里尔字母base64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34175138/

相关文章:

php - MySQL-组织数据库内容(体育联盟)

php - 存储过程 phpmyadmin

php - jQuery 从选定的复选框中获取值

c# - 将 JSON 转换为 XML

javascript - 如何使用React Native减少从react-native-image-picker获取的base64图像的大小以将其保存在firebase中

PHP 多维数组 foreach

php - PHP 的 Assets 管道/框架

javascript - React 组件未在 Bootstrap 选项卡中呈现

javascript - 在 JavaScript 中显示/隐藏

javascript - 超链接不会在新标签页中打开