2015-12-09 40 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

你沒有提到你的問題有任何進一步的處理。由於您的示例字符串可以在我的環境中有效解碼,請。將您的問題擴展到實際問題。 –

回答

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 861101 0000 1000 0110 - 這是一個有效的UTF-8 2 byte sequence作爲第一個字節與110開始,而第二字節與10開始 - 從數字的其餘部分,我們可以提取二進制值100 0000 01100x406 - 這是一個Cyrllic character

所以它看起來不錯。事實證明,這很好!如果我在php中使用json_decode,並且var_dump爲設置爲UTF-8的控制檯生成的數據,它對我來說看起來不錯。

所以一切都很好 - 你顯示的數據不希望UTF-8編碼的文本。

+0

這很奇怪,因爲當我測試編碼的字符串在https://www.base64decode.org它給了我想要的確切結果。 – Golovior

+0

其實,我誤解了這個問題,並認爲JSON被破壞了 - 這實際上就是你應該擁有的 - 該西里爾字符串的編碼必須以其他方式被破壞...... –

+0

我添加了我編碼的方式該數組(首先到json字符串,然後到url編碼,unescaping,最後到base64)。我能以更好的方式做到這一點嗎? – Golovior

0

我有編碼的字符串:

eyJuYW1lT3JkZXIiOlsicHJvcGVydHlpZCIsInByb2plY3RuYW1lIiwiZW52aXJvbm1lbnQiLCJ2YXJpYWJsZSIsInZhbHVlIiwiY29tcG9uZW50IiwidXNhZ2UiLCJhY2Nlc3N0eXBlIiwidmVyc2lvbiIsImxhbmd1YWdlIl0sInBhcmFtZXRlcnMiOlsiNjg1IiwiRGVtbyIsInByb2QiLCJsYWkiLCJ2YWx1ZdCG0L3QtNC10LrRgSDQm9C40YHRgtC+0LLQvtGXINCf0L7QstC10YDRhdC90ZYgKC0pIiwiVHJhbnNsYXRpb24iLCJOT1RUUkFOU0xBVEVEIiwid3JpdGUiLCIwLjQuMCIsInVrIl19Cg== 

也許你哈德與編碼中的煩惱嗎?我使用bash中的base64。 對不起,我不能說爲什麼編碼失敗(也許解析錯誤?)

+0

我發送編碼的字符串通過一個GET到服務器,所以這可能是這是爲什麼它不同? – Golovior

0

發現錯誤。這就像Paul Dixon在他最後的評論中所說的那樣。
我使用的字符串編碼爲包含加號的字符串。查詢字符串刪除了查詢字符串,解碼沒有按照原樣進行。