2017-02-18 6 views
0

В моем скрипте PHP я пытаюсь отправить символы utf8 на веб-сайт google translate, чтобы они могли отправить мне перевод текста, но это не работает для символов UTF8, таких как китайский, арабский и русский, и я не могу понять, почему. Если я пытаюсь перевести 'как дела' на английский я мог бы использовать эту ссылку: https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=как ДелаPHP с использованием символов UTF8 в URL-адресе, ошибка кодирования url

И было бы вернуть это: [[[ "как ты", "как дела" ,,, 1]] ,, "ru"]

Прекрасный перевод, именно то, что я хотел, но если я попытаюсь воссоздать его в PHP, я это сделаю (я использовал байты в начале, потому что мой будущий скрипт будет использовать байты в качестве отправной точки):

<?php 
$bytes = array(1082,1072,1082,32,1076,1077,1083,1072); // bytes of: как дела 
$str = ""; 

for($i = 0; $i < count($bytes); ++$i) { 
    $str .= json_decode('"\u' . '0' . strtoupper(dechex($bytes[$i])) . '"'); // returns string: как дела 
} 

$from = 'ru'; 
$to = 'en'; 
$url = 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=' . $from . '&tl=' . $to . '&dt=t&q=' . $str; 
$call = fopen($url,"r"); 
$contents = fread($call,2048); 

print $contents; 
?> 

И выводит: [[[ "RєR RєRґRμR ° \" ° F "" РєР ° РєРґРμР »Р °» ,,, 0]] ,, "ру"]

Выход не имеет смысла, похоже, что мой PHP-скрипт отправляет строку «РєР ° РєРґРμР» Р ° 'для перевода на английский для меня. Я прочитал кое-что о том, как сделать символы UTF-8 доступными для google в URI (или url). В нем говорится, что я должен передать свои байты в кодовые единицы UTF-8 и поместить их в свой url. Я еще не понял, как передавать байты в кодовые единицы UTF-8, но сначала я хотел попробовать, если он сработает. Я начал с преобразования моего текста «как дела» в единицы кода (с процентами для URL), чтобы проверить его сам. Это привело к следующей ссылке: https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=%D0%BA%D0%B0%D0%BA+%D0%B4%D0%B5%D0%BB%D0%B0

И при тестировании в браузере он возвращается: [[[ "как ты", "как дела" ,,, 1]] ,, "ру"]

Опять прекрасный перевод, кажется, это работает, так что я пытался реализовать это в моем сценарии со следующим кодом:

<?php 
$from = 'ru'; 
$to = 'en'; 
$text = "%D0%BA%D0%B0%D0%BA+%D0%B4%D0%B5%D0%BB%D0%B0"; // code units of: как дела 
$url = 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=' . $from . '&tl=' . $to . '&dt=t&q=' . $text; 
$call = fopen($url,"r"); 
$contents = fread($call,2048); 

print $contents; 
?> 

Этот скрипт выводит: [[[ «RєR Rе RґRμR ° \» ° F «» РєР ° РєРґРμР »Р °" ,,, 0]] ,, "ru"]

Снова мой сценарий не выводит то, что я хочу, и что получаю, когда Я тестирую эти URL в своем браузере. Я не могу понять, что я делаю неправильно, и почему google реагирует на беспорядок символов, если я использую ссылку в своем PHP-файле.

Кто-нибудь знает, как получить результат, который я хочу? Заранее спасибо!

Обновленный код для установки строки в UTF8, (не работает)

Я добавил много настроек в верхней части файла PHP, чтобы убедиться, что все в формате UTF8. Также я добавил mb_convert_encoding на полпути, но результат продолжает быть неправильным. Функция fopen не отправляет правильную строку UTF-8 в google.

выход я получаю:

URL: https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=%D0%BA%D0%B0%D0%BA%20%D0%B4%D0%B5%D0%BB%D0%B0 
Encoding: ASCII 
File contents: [[["RєR Rє RґRμR ° \"° F","как дела",,,0]],,"ru"] 

код я использую:

<?php 
header('Content-Type: text/html; charset=utf-8'); 
$TYPO3_CONF_VARS['BE']['forceCharset'] = 'utf-8'; 
mb_internal_encoding('UTF-8'); 
mb_http_output('UTF-8'); 
mb_http_input('UTF-8'); 
mb_language('uni'); 
mb_regex_encoding('UTF-8'); 
ob_start('mb_output_handler'); 

$from = 'ru'; 
$to = 'en'; 
$text = rawurlencode('как дела'); 
$url = 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=' . $from . '&tl=' . $to . '&dt=t&q=' . $text; 
$url = mb_convert_encoding($url, "UTF-8", "ASCII"); 
$call = fopen($url,"r"); 
$contents = fread($call,2048); 

print 'URL: ' . $url . '<br>'; 
print 'Encoding: ' . mb_detect_encoding($url) . '<br>';; 
print 'File contents: ' . $contents; 
?> 
+2

Ваш PHP по умолчанию не кодируется UTF-8. вам нужно вручную установить это в PHP-коде. [читать о UTF-8] (http://stackoverflow.com/questions/279170/utf-8-all-the-way-through).Вам нужно установить атрибуты ['mb_string'] (http://www.php.net/manual/en/book.mbstring.php). – Martin

+1

*** редактируйте *** ваш вопрос, не отправляйте код в комментариях, это довольно нечитаемо. Cheers – Martin

+0

Я обновил сообщение открытия. – Sportline83

ответ

0

Решено! Я получил подсказку от другого не с этих форумов, чтобы посмотреть на столбец stackoverflow this о настройке пользовательского агента. После нескольких исследований я обнаружил, что ответ this был решением моей проблемы. Теперь все работает отлично!

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