Autor Zpráva
miskith
Profil
*Vyřešeno* - Viz "EDITED3" na konci.

Dobrý den,
zajímalo by mě, jestli někdo ví, proč tento jednoduchý script konvertuje JSON pouze pokud mu to podstrčím přímo jako string, ale jako proměnnou to nechce vzít.

Script:
<?php

     echo $text = file_get_contents("http://api.microsofttranslator.com/V2/Ajax.svc/GetTranslations?appId=AppId&text=Ich%20bin%20here.&to=cs&maxTranslations=5&options={\"ContentType\":\"text/plain\"}");
echo "\n";
print_r(json_decode('{"From":"de","Translations":[{"Count":0,"MatchDegree":100,"MatchedOriginalText":"","Rating":5,"TranslatedText":"Jsem tady."}]}', true));
echo "\n";
print_r(json_decode($text, true));
?>

Výpis:
{"From":"de","Translations":[{"Count":0,"MatchDegree":100,"MatchedOriginalText":"","Rating":5,"TranslatedText":"Jsem tady."}]}
Array
(
    [From] => de
    [Translations] => Array
        (
            [0] => Array
                (
                    [Count] => 0
                    [MatchDegree] => 100
                    [MatchedOriginalText] => 
                    [Rating] => 5
                    [TranslatedText] => Jsem tady.
                )

             )

     )

Jak vidíte. Co mi vráti file_get_contents() si zapíšu do proměnné $text. To co mi ta proměnná obsahuje vložím přímo do json_decode() a pod tím pouze tu proměnnou, ale provede se pouze první json_decode(). Zkoušel sem si i vypsat json_last_error() a to mi vypsalo 4. error (syntax).

Děkuji za pomoc a přeji pěkné prožití vánočních svátků a šťastný nový rok ;).

PS: AppId jsem tady na diskusi skryl.
EDITED: Pořád to zkouším a zjistil sem, že pokud ručně zapíšu do proměnné text string, který vrací fce file_get_contents(), tak to funguje:
$text = '{"From":"de","Translations":[{"Count":0,"MatchDegree":100,"MatchedOriginalText":"","Rating":5,"TranslatedText":"Jsem tady."}]}';
print_r(json_decode($text, true));
EDITED2: Zkusil sem dát na proměnnou $text var_dump()
var_dump($text);
a porovnal sem co mi to vypíše, když do proměnné ručně vložím string a když ho získám přes file_get_contents(). Ručně mi to napsalo, že jde o string dlouhý 126 znaků a přes file_get_contents() mi to napsalo, že jde o string dlouhý 129 znaků, ale nemůžu přijít na to, o jaký znaky navíc tam jde. Zkusil sem už funkci trim() i htmlspecialchars_decode() a stále to nefunguje (string(129)).
EDITED3:
Tak sem to už vyřešil.. Protože rozdíl délky stringů byly 3 znaky, zkusil sem dát:
print_r(json_decode(substr($text, 3), true));
a ono to funguje. Sice stále nevím, co to je za ty tři neviditelné znaky na začátku, ale funguje to. Kdyby někdo věděl co to je zač, mohl by mi to říci?
Mike8748
Profil
předpokládám že ty 3 záhadné znaky na začátku byla BOM signatura kterou ti tam vložil editor když si to ukládal jako utf8

ve většině normálních editorů jde vkládání BOM vypnout.
miskith
Profil
Já tam BOM nemám. Data tahám z Bing translatoru a když otevřu v prohlížeči tu URL (Bing translatoru) a podívám se do zdrojáku, není tam BOM (když je na webu BOM a podívám se do zdrojáku, vždycky tam vidím na začátku takové 3 znaky). Ale třeba nový Firefox už BOM nezobrazuje.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0