|
|
|
| Всем привет! Недавно нашел баг у своего скрипта переводчика==)
Через сокеты делаю запрос на translate.ru и перевожу текст.
Но есть проблема если переводить русский текст на русский=) тоесть писать русское слово и ставить англо-русский перевод то скрипт возвращает абракатабру:( ( С, РцС€С, ) хотя если переволить так на самом сайте у них все норм.
в чем может быть проблема??? кто знает помогите!
Вот сам скрипт:
<?
function translate($values = false) {
$direction = array ( // Доступные варианты перевода
'er' => "Англо-Русский перевод",
're' => "Русско-Английский перевод"
); // Доступные варианты перевода
$values[0] = isset($values[0]) && $values[0] <> '' ? $values[0] : false;
$values[1] = isset($values[1]) && $values[1] <> '' ? strtolower($values[1]) : 'er';
$host = "www.translate.ru"; // Урла сайта
$port = 80; // Порт
$path = "/text.asp"; // Обработчик формы
if (!$values[0]) { // Если текс пустой выходим
return false;
} elseif (!isset($direction[$values[1]])) { // Если вариант перевода несовместим выходим
return false;
} elseif (!$fp = @fsockopen($host, $port, $errorn, $errorm, 2)) { // Если ошибка при открытии файла выходим
return false;
} else {
$fields = "lang=ru&status=translate&transliterate=on&direction=".urlencode($values[1])."&source=".urlencode($values[0])."\r\n\r\n"; // Поля для запроса
$headers = "";
$headers .= "POST ".$path." HTTP/1.1\r\n"; // Отправляем заголовки POST
$headers .= "Host: ".$host."\r\n"; // Отправляем хост
$headers .= "Accept: */*\r\n"; // Отправляем хост
$headers .= "Content-type: application/x-www-form-urlencoded\r\n"; // Тип форм
$headers .= "Referer: http://www.translate.ru/text.asp\r\n"; // Подделываем реферер
$headers .= "User-Agent: Opera/9.02 (Windows NT 5.1; U; ru)\r\n"; // Подделываем юзер-агент
$headers .= "Content-Length: ".strlen($fields)."\r\n"; // Длина запроса
$headers .= "Connection: close\r\n"; // Закрываем коннект
$headers .= "\r\n";
$headers .= $fields;
$result = "";
// echo $headers; exit;
fwrite($fp, $headers); // Отправляем заголовки серваку $host
while(!feof($fp)) {
$result .= fread($fp, 1024); // Получаем ответ сервера $host
}
fclose($fp); echo $result;
if (preg_match("/<span\s*id=[\"']r_text[\"']\s*name=[\"']r_text[\"']>(.+?)<\/span>/si", $result, $result)) {
}
$result = trim($result[1]);
return preg_replace_callback("/(&#[0-9]{1,4};)/i", create_function('$matches', 'return html_entity_decode($matches[1], ENT_NOQUOTES, \'cp1251\');'), $result);
}
return false;
}
// Вызывать так:
echo translate(array('текст для перевода', 'метод перевода er или re'));
|
| |
|
|
|
|
|
|
|
для: Poison
(19.05.2007 в 12:28)
| | скрипт возвращает абракатабру
Это UTF-8. | |
|
|
|
|
|
|
|
для: Unkind
(19.05.2007 в 13:27)
| | только почему так и как это вернуть в нормальный текст? | |
|
|
|
|
|
|
|
для: Poison
(19.05.2007 в 16:13)
| | $win1251 = iconv ('utf-8', 'cp1251', $utf8); | |
|
|
|
|
|
|
|
для: bronenos
(19.05.2007 в 16:42)
| | Пробывал перевести вот это С, РцС€С, в понятнй текст=) ( кстати здесь слово тест)
Что-то ничего неполучаеться:(
iconv выдает вот таке:
Notice: iconv() [function.iconv]: Detected an illegal character in input string
|
| |
|
|
|
|
|
|
|
для: Poison
(19.05.2007 в 17:40)
| | не знаю, к чему относится эта ошибка, но попробуйте тогда вторым параметром windows-1251 | |
|
|
|
|
|
|
|
для: Poison
(19.05.2007 в 12:28)
| | Посмотрите начало содержимого переменной $result. Строка Content-Type. | |
|
|
|
|
|
|
|
для: Trianon
(19.05.2007 в 18:57)
| |
Content-Type: text/html; Charset=windows-1251
|
| |
|
|
|
|
|
|
|
для: Poison
(19.05.2007 в 20:27)
| | отправьте такой же заголовок на самой странице тоже | |
|
|
|
|
|
|
|
для: Poison
(19.05.2007 в 20:27)
| | А сами-то в какой кодировке это слово передаете? | |
|
|
|
|
|
|
|
для: Unkind
(19.05.2007 в 20:56)
| | Отправлять заголовок пробывал... тоже самое
Передаю в windows-1251
З.Ы Я же привел скрипт=) | |
|
|
|
|
|
|
|
для: Poison
(19.05.2007 в 21:11)
| | Я же привел скрипт
И как я по нему определю кодировку, в которой он у вас на сервере записан? | |
|
|
|
|
|
|
|
для: Poison
(19.05.2007 в 20:27)
| | я сейчас глянул www.translate.ru ... мне он вернул результат в виде HTML-character-encoding: владение
В целом, достаточно естественно, что html_entity_decode не желает возвращать результат в однобайтовой кодировке. | |
|
|
|
|
|
|
|
для: Trianon
(19.05.2007 в 23:36)
| | Проблема в том что строка уже до этого в utf
fclose($fp); echo $result; // Выводит уже utf:(
Так и не могу понять что-же в скрипте не так... | |
|
|
|
|
|
|
|
для: Poison
(20.05.2007 в 00:25)
| | Не верю.
Загоните содержимое отклика до парсинга прегом в файл,
fclose($fp);
$fp = fopen("result.bin", "wb"); fwrite($fp, $result); fclose($fp)
echo $result;
|
и прикрепите его к ответу. Не верю я, что там utf.
А даже если и UTF? | |
|
|
|
|
|
|
|
для: Trianon
(20.05.2007 в 00:39)
| | Там utf кодированный в HTML
С, РцС€С,
|
Но все равно приходим та к томуже=))) | |
|
|
|
|
|
|
|
для: Poison
(20.05.2007 в 00:55)
| | Я же говорил, что не UTF.... | |
|
|
|
|
|
|
|
для: Trianon
(20.05.2007 в 01:12)
| | =)) Да ну как мне это расшифровать?=) | |
|
|
|