我有一个来自 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 86
为 1101 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/