2015-12-09 2 views
0

У меня есть base64 закодированная строка JSON из JavaScript с частью кириллического текста. Я отправляю это на сервер и хочу декодировать base64, но это дает мне странный результат.декодировать кириллицу base64 в php

Строка:

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, чтобы получить строку из URL-адреса, она изменяется. Я думаю, что это проблема. Что я могу сделать, чтобы получить правильную строку из URL-адреса?

+0

Хорошо работает, когда кодировка браузера установлена ​​на utf-8. –

+0

Но я не показываю результат в браузере, я только отправляю его на сервер, поэтому могу его обработать. Там он не обрабатывается в utf-8. – Golovior

+0

Вы не упомянули о дальнейшей обработке в своем вопросе. Так как ваша строка примера может быть правильно расшифрована в моей среде, pls. разверните свой вопрос до актуальной проблемы. –

ответ

1

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 или 0x406 - это Cyrllic character

Так это выглядит хорошо. И, как оказалось, это хорошо! Если я json_decode, что в php и var_dump результирующие данные в консоли, настроенной для UTF-8, это выглядит хорошо для меня.

Итак, все в порядке - вы показываете данные где-то, что не ожидает кодированного текста в формате UTF-8.

+0

Это странно, потому что, когда я тестирую закодированную строку на https://www.base64decode.org, она дает мне точный результат, который я хочу. – Golovior

+0

На самом деле, я неправильно понял проблему и думал, что JSON был сломан - это действительно то, что вы должны иметь - кодирование этой кириллической строки должно быть разбито другими способами ... –

+0

Я добавил, как я кодирую массив (сначала до строки json, а затем для кодирования url, unescaping и, наконец, base64). Могу ли я сделать это лучше? – Golovior

0

У меня есть, что закодированная строка:

eyJuYW1lT3JkZXIiOlsicHJvcGVydHlpZCIsInByb2plY3RuYW1lIiwiZW52aXJvbm1lbnQiLCJ2YXJpYWJsZSIsInZhbHVlIiwiY29tcG9uZW50IiwidXNhZ2UiLCJhY2Nlc3N0eXBlIiwidmVyc2lvbiIsImxhbmd1YWdlIl0sInBhcmFtZXRlcnMiOlsiNjg1IiwiRGVtbyIsInByb2QiLCJsYWkiLCJ2YWx1ZdCG0L3QtNC10LrRgSDQm9C40YHRgtC+0LLQvtGXINCf0L7QstC10YDRhdC90ZYgKC0pIiwiVHJhbnNsYXRpb24iLCJOT1RUUkFOU0xBVEVEIiwid3JpdGUiLCIwLjQuMCIsInVrIl19Cg== 

Может быть, вы мастерил проблемы с кодировкой? Я использовал base64 от bash. Извините, я не могу сказать, почему кодировка не удалась (возможно, ошибка синтаксического анализа?)

+0

Я отправляю закодированную строку через GET на сервер, так что, возможно, это причина, почему она отличается? – Golovior

0

Обнаружили ошибку. Это как сказал Пол Диксон в своем последнем комментарии.
Строка, которую я использовал, кодируется в строку, в которую включен знак плюс. Запросчик удалил это из строки запроса, и декодирование не пошло так, как должно.

Смежные вопросы