Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Переводчик (кодировка)
 
 автор: Poison   (19.05.2007 в 12:28)   письмо автору
 
 

Всем привет! Недавно нашел баг у своего скрипта переводчика==)

Через сокеты делаю запрос на 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$errorm2)) { // Если ошибка при открытии файла выходим
            
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($fp1024); // Получаем ответ сервера $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'));

   
 
 автор: Unkind   (19.05.2007 в 13:27)   письмо автору
 
   для: Poison   (19.05.2007 в 12:28)
 

скрипт возвращает абракатабру
Это UTF-8.

   
 
 автор: Poison   (19.05.2007 в 16:13)   письмо автору
 
   для: Unkind   (19.05.2007 в 13:27)
 

только почему так и как это вернуть в нормальный текст?

   
 
 автор: bronenos   (19.05.2007 в 16:42)   письмо автору
 
   для: Poison   (19.05.2007 в 16:13)
 

$win1251 = iconv ('utf-8', 'cp1251', $utf8);

   
 
 автор: Poison   (19.05.2007 в 17:40)   письмо автору
 
   для: bronenos   (19.05.2007 в 16:42)
 

Пробывал перевести вот это С, РцС€С, в понятнй текст=) ( кстати здесь слово тест)
Что-то ничего неполучаеться:(
iconv выдает вот таке:

Notice: iconv() [function.iconv]: Detected an illegal character in input string

   
 
 автор: bronenos   (19.05.2007 в 18:40)   письмо автору
 
   для: Poison   (19.05.2007 в 17:40)
 

не знаю, к чему относится эта ошибка, но попробуйте тогда вторым параметром windows-1251

   
 
 автор: Trianon   (19.05.2007 в 18:57)   письмо автору
 
   для: Poison   (19.05.2007 в 12:28)
 

Посмотрите начало содержимого переменной $result. Строка Content-Type.

   
 
 автор: Poison   (19.05.2007 в 20:27)   письмо автору
 
   для: Trianon   (19.05.2007 в 18:57)
 


Content-Type: text/html; Charset=windows-1251

   
 
 автор: bronenos   (19.05.2007 в 20:35)   письмо автору
 
   для: Poison   (19.05.2007 в 20:27)
 

отправьте такой же заголовок на самой странице тоже

   
 
 автор: Unkind   (19.05.2007 в 20:56)   письмо автору
 
   для: Poison   (19.05.2007 в 20:27)
 

А сами-то в какой кодировке это слово передаете?

   
 
 автор: Poison   (19.05.2007 в 21:11)   письмо автору
 
   для: Unkind   (19.05.2007 в 20:56)
 

Отправлять заголовок пробывал... тоже самое

Передаю в windows-1251

З.Ы Я же привел скрипт=)

   
 
 автор: Unkind   (19.05.2007 в 23:33)   письмо автору
 
   для: Poison   (19.05.2007 в 21:11)
 

Я же привел скрипт
И как я по нему определю кодировку, в которой он у вас на сервере записан?

   
 
 автор: Trianon   (19.05.2007 в 23:36)   письмо автору
 
   для: Poison   (19.05.2007 в 20:27)
 

я сейчас глянул www.translate.ru ... мне он вернул результат в виде HTML-character-encoding: &#1074;&#1083;&#1072;&#1076;&#1077;&#1085;&#1080;&#1077;
В целом, достаточно естественно, что html_entity_decode не желает возвращать результат в однобайтовой кодировке.

   
 
 автор: Poison   (20.05.2007 в 00:25)   письмо автору
 
   для: Trianon   (19.05.2007 в 23:36)
 

Проблема в том что строка уже до этого в utf

fclose($fp); echo $result; // Выводит уже utf:(
Так и не могу понять что-же в скрипте не так...

   
 
 автор: Trianon   (20.05.2007 в 00:39)   письмо автору
 
   для: Poison   (20.05.2007 в 00:25)
 

Не верю.
Загоните содержимое отклика до парсинга прегом в файл,

fclose($fp); 
$fp = fopen("result.bin", "wb"); fwrite($fp, $result); fclose($fp)
echo $result; 

и прикрепите его к ответу. Не верю я, что там utf.

А даже если и UTF?

   
 
 автор: Poison   (20.05.2007 в 00:55)   письмо автору
 
   для: Trianon   (20.05.2007 в 00:39)
 

Там utf кодированный в HTML


&#1057;, &#1056;&#1094;&#1057;&#8364;&#1057;,


Но все равно приходим та к томуже=)))

   
 
 автор: Trianon   (20.05.2007 в 01:12)   письмо автору
 
   для: Poison   (20.05.2007 в 00:55)
 

Я же говорил, что не UTF....

   
 
 автор: Poison   (20.05.2007 в 11:22)   письмо автору
 
   для: Trianon   (20.05.2007 в 01:12)
 

=)) Да ну как мне это расшифровать?=)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования