在php中解码cyrillic base64

时间:2015-12-09 09:29:46

标签: javascript php

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

字符串:

    eyJuYW1lT3JkZXIiOlsicHJvcGVydHlpZCIsInByb2plY3RuYW1lIiwiZW52aXJvbm1lbnQiLCJ2YXJpYWJsZSIsInZhbHVlIiwiY29tcG9uZW50IiwidXNhZ2UiLCJhY2Nlc3N0eXBlIiwidmVyc2lvbiIsImxhbmd1YWdlIl0sInBhcmFtZXRlcnMiOlsiNjg1IiwiRGVtbyIsInByb2QiLCJsYWkiLCJ2YWx1ZdCG0L3QtNC10LrRgSDQm9C40YHRgtC+0LLQvtGXINCf0L7QstC10YDRhdC90ZYgKC0pIiwiVHJhbnNsYXRpb24iLCJOT1RUUkFOU0xBVEVEIiwid3JpdGUiLCIwLjQuMCIsInVrIl19

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

btoa(unescape(encodeURIComponent(JSON.stringify(数组))))

预期结果:

{  
   "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从网址中获取字符串时,它会发生变化。我认为这是问题所在。我该怎么做才能从网址中获取正确的字符串?

3 个答案:

答案 0 :(得分:1)

TLDR - 编码数据很好,你只是在一个不期望UTF-8的环境中显示它。

在处理编码问题时,我发现有必要牢牢掌握编码的工作原理,这样你就可以深入研究十六进制转储,以消除错误配置输出的可能性.... / p>

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

    String text = "id=2009,name=Susie,city=Berlin,phone=0723178,birthday=1991-12-07";

    final Map<String, String> infoMap = Splitter.on(",")
            .omitEmptyStrings()
            .trimResults()
            .withKeyValueSeparator("=")
            .split(text);

    System.out.println(infoMap.get("name"));
    System.out.println(infoMap.get("birthday"));

让我们对单词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 之后的序列进行解码 - 它看起来像有效的UTF-8。所以我们可以在这些编码字符中将它分开

value

只需将第一个作为完整性检查,二进制中的序列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 - 这是一个有效的UTF-8 2 byte sequence,因为第一个字节以{{1}开头},第二个字节以1101 0000 1000 0110开头 - 从其余数字我们可以提取二进制值11010 - 那个&#39; sa Cyrllic character

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

所以一切都很好 - 你在不知道UTF-8编码文本的地方显示数据。

答案 1 :(得分:0)

我有那个编码的字符串:

eyJuYW1lT3JkZXIiOlsicHJvcGVydHlpZCIsInByb2plY3RuYW1lIiwiZW52aXJvbm1lbnQiLCJ2YXJpYWJsZSIsInZhbHVlIiwiY29tcG9uZW50IiwidXNhZ2UiLCJhY2Nlc3N0eXBlIiwidmVyc2lvbiIsImxhbmd1YWdlIl0sInBhcmFtZXRlcnMiOlsiNjg1IiwiRGVtbyIsInByb2QiLCJsYWkiLCJ2YWx1ZdCG0L3QtNC10LrRgSDQm9C40YHRgtC+0LLQvtGXINCf0L7QstC10YDRhdC90ZYgKC0pIiwiVHJhbnNsYXRpb24iLCJOT1RUUkFOU0xBVEVEIiwid3JpdGUiLCIwLjQuMCIsInVrIl19Cg==

也许你对编码有困难?我从bash使用了base64。 对不起,我不能说为什么编码失败(可能是解析错误?)

答案 2 :(得分:0)

发现错误。这就像保罗迪克森在上次评论中所说的那样 我使用的字符串编码为包含加号的字符串。查询字符串从查询字符串中删除了它,并且解码没有按预期进行。