DarkDaNTe » 2010.08.14 18:14

Как правильно определить неизвестную кодировку и перекодировать её в utf-8?
При перекодировании windows-1251 в utf-8 все символы изменялись на какой-то непонятный код. Например двоеточие в \u003d\u0026gt; .
Помогите.

Gemorroj » 2010.08.14 18:43

это одна из разновидностей юникода. чем пользуешься для конвертирования?

DarkDaNTe » 2010.08.14 20:21

iconv

DarkDaNTe » 2010.08.14 21:23

Вот как на google translate. В какой бы кодировке не скопировал туда - все нормально переводит. А у меня нет. И еще не знаешь, как сделать, чтобы на выходе получился форматированный текст? Перевод при помощи Google Translate Api.

Код:

1
span style="color: #0000BB"><?phpfunction json2array($json){ if(get_magic_quotes_gpc()){ $json = stripslashes($json); } $json = substr($json, 1, -1); $json = str_replace(array(":", "{", "[", "}", "]"), array("=>", "array(", "array(", ")", ")"), $json); @eval("\$json_array = array({$json});"); return $json_array;}/* $s_text - текст для перевода $s_lang - с какого языка переводим (например ru) $d_lang - на какой язык переводим (например en)*/function translate($s_text, $s_lang, $d_lang) { $url='http://ajax.googleapis.com/ajax/services/language/translate?v=1.0'; $post='q='.urlencode($s_text).'&langpair='.$s_lang.'%7C'.$d_lang.'&key=notsupplied'; $c = curl_init(); curl_setopt($c, CURLOPT_URL, $url); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_REFERER, "http://site.ru/"); curl_setopt($c, CURLOPT_POST, 1); curl_setopt($c, CURLOPT_POSTFIELDS, $post); $b = curl_exec($c); curl_close($c); $json = json2array($b, true); if ($json['responseStatus'] != 200)return false; return $json['responseData']['translatedText']; }?>

Форматированный текст, типа если ввел

Код:

1
2
3
Текст
 
Текст

и перевел на английский, получилось:

Код:

1
2
3
Text
 
Text

Добавлено спустя    39 секунд:
PS: извиняюсь за функцию json2array - просто нету json'a нормального)

Gemorroj » 2010.08.15 11:38

текст вставь внутрь <pre></pre>
в каком месте получается этот юникод? гугл возвращает?

DarkDaNTe » 2010.08.15 12:00

Я копирую текст с одного сайта, там кодировка windows-1251. Перевожу сразу оригинал - получаются кракозябры. Если изменяю кодировку при помощи iconv - появляется этот юникод.
По поводу кто возвращает сейчас скажу.
Добавлено спустя   4 минуты  30 секунд:
Этот юникод возвращает функция гугла. Еще оно <pre></pre> игнорирует.
Если без перевода, то все отлично получается, а так... странно
Добавлено спустя   6 минут  36 секунд:
а может это из-за аналога функции json?

Gemorroj » 2010.08.15 12:22

может быть, именно такой юникод используется в JS

DarkDaNTe » 2010.08.15 12:24

Хм, а как тогда перевести гуглом, чтобы все получилось?

Gemorroj » 2010.08.15 12:43

DarkDaNTe написал:

Я копирую текст с одного сайта, там кодировка windows-1251. Перевожу сразу оригинал - получаются кракозябры.

я не понимаю где именно проблема. iconv дает это, либо апи гугла?

DarkDaNTe » 2010.08.15 13:07

Апи гугла
Добавлено спустя   4 минуты  47 секунд:
Да, точно, апи гугла.
Может не в utf-8 перекодировать?

DarkDaNTe » 2010.08.15 14:06

и после гугл апи <pre> не катит
Добавлено спустя   7 минут  45 секунд:
Интуиция решает) Вся проблема была в корявой функции, заменяющей нормальный json_decode.
Полазил по документации в гугле и нашел PEAR класс, рекомендованый гуглом, если нет json.
Зря только плохо думал про Google Api)
Все сделал) Но <pre> все еще не срабатывает)
Добавлено спустя   9 минут  35 секунд:
http://pear.php.net/pepr/pepr-proposal-show.php?id=198 - вот если кому пригодится.

Код:

1
span style="color: #0000BB"><?phpif ( !function_exists('json_decode') ){ function json_decode($content, $assoc=false){ require_once 'JSON.php'; if ( $assoc ){ $json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE); } else { $json = new Services_JSON; } return $json->decode($content); }}if ( !function_exists('json_encode') ){ function json_encode($content){ require_once 'Services/JSON.php'; $json = new Services_JSON; return $json->encode($content); }}?>
DarkDaNTe » 2010.08.15 14:24

Ну и еще если кому понадобится) Текст, который вы отправляете на перевод пропускаем через nl2br();
Все. Вопрос исчерпан.