Google translate

Запускаем такой скриптик:
 <?php
// берём чешское слово 'Koláče' (пироги), подготавливаем к передаче через URL 
$text = urlencode('Koláče');
// формируем запрос
$query = "http://translate.google.com/translate_a/t?client=x&text={$text}&sl=cs&tl=en";
// который в итоге выглядит так: 
// http://translate.google.com/translate_a/t?client=x&text=Kol%C3%A1%C4%8De&sl=cs&tl=en


// посылаем для перевода
// этот кусок взял отсюда: 
//http://stackoverflow.com/questions/542046/php-file-get-contentsloc-fails
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $query);
$response = curl_exec($curl);
curl_close($curl);
// но вместо него можно и проще, результат будет одинаков:
// $response = file_get_contents($query);


echo $response;
?>

в ответ получаем JSON-объект вот с такой фигнёй:
{"sentences":[{
  "trans":"Kol\u0102\u0104\u00C4 e",
  "orig":"Kol\u0102\u0104\u00C4 e",
  "translit":"",
  "src_translit":""
}],"src":"cs","server_time":2}

Обратите внимание на поле orig, каким-то неведомым образом строка 'Kol%C3%A1%C4%8De' трасформировалась в 'Kol\u0102\u0104\u00C4 e'.
А если запрос translate.google.com/translate_a/t?client=x&text=Kol%C3%A1%C4%8De&sl=cs&tl=en просто вбить в адресную строку браузера, по получим красивый правильный ответ:
{"sentences":[{
  "trans":"Pies",
  "orig":"Koláče",
  "translit":"",
  "src_translit":""
}],"src":"cs","server_time":41}

Буду премного благодарен, если кто объяснит, почему так.

Доп. информация: исходная строка в utf-8, да это и не важно, ведь после urlencode получаем только ASCII-символы. С английского переводит нормально, что логично, ведь символы дополнительно не кодируются.

Подозреваю, что браузеры отправляют какие-то «правильные» заголовки, но так ли это, а если так, то как их узнать, а главное, как их отправлять вручную?
  • Вопрос задан
  • 6035 просмотров
Решения вопроса 1
mitry
@mitry
Похоже, это у гугла это зависит от User-Agent:
Можно проверить на web-sniffer.net/ Для браузеров ответ приходит в UTF-8, а для 'Web-sniffer' или пустого User-Agent:\u-encoded
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
shushu
@shushu
Всё правильно, это такой формат у JSON для хранения UTF-8 символов, более того, если сделать json_decode этой строки — то всё должно встать на место.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы