Программа
mystem производит морфологический анализ текста на русском языке.
Пытаюсь с помощью нее обработать строку:
<?php<br/>
function mystem($q) {<br/>
$out = array();<br/>
exec('echo ' . $q . ' | ' . dirname(__FILE__) . '\mystem\mystem.exe -i', $out);<br/>
$q = implode('', $out);<br/>
return $q;<br/>
}<br/>
<br/>
echo mystem('в мурелки шлепают пельсиски');<br/>
?>
XAMPP 1.7.3, php 5.3.1, windows 7, результат вывожу в документе с кодировкой utf-8
На выходе вижу:
�{�??}�{�??}��{��??}���{���??}�{�??}����{����??}���{���??}��{��??}���{���??}
Проблема в кодировке, т.к. по-умолчанию mystem работает с cp1251. Пытаюсь добавить параметр
-e для изменения кодировки (см.
документацию), меняю соответствующую строку:
exec('echo ' . $q . ' | ' . dirname(__FILE__) . '\mystem\mystem.exe -e utf-8 -i', $out);
Не выводит ничего.
Попробовал так же работать с windows-1251:
<?php<br/>
function mystem($q) {<br/>
$out = array();<br/>
$q = iconv("utf-8", "windows-1251", $q);<br/>
exec('echo ' . $q . ' | ' . dirname(__FILE__) . '\mystem\mystem.exe -i', $out);<br/>
$q = implode('', $out);<br/>
return $q;<br/>
}<br/>
<br/>
echo mystem('в мурелки шлепают пельсиски');<br/>
?>
результат вывожу в документе с кодировкой windows-1251
На выходе:
ў{ў??}гаҐ{гаҐ??}ЄЁ{ЄЁ??}и{и=INTJ=|и=PART=|и=S,сокр=им,ед|=S,сокр=им,мн|=S,сокр=род,ед|=S,сокр=род,мн|=S,сокр=дат,ед|=S,сокр=дат,мн|=S,сокр=вин,ед|=S,сокр=вин,мн|=S,сокр=твор,ед|=S,сокр=твор,мн|=S,сокр=пр,ед|=S,сокр=пр,мн|и=CONJ=}ҐЇ{ҐЇ??}ов{ов??}ЇҐ{ЇҐ??}мбЁбЄЁ{мбЁбЄЁ??}
Обработана корректно только буква
и, все остальное — кракозябры.
Из-за чего так происходит? Что я делаю не так? Пожалуйста, объясните ошибки. Заранее спасибо.
Update: antoo, спасибо, ваше решение работает.
В итоге сделал так для кода в utf-8:
<?php<br/>
function mystem($q) {<br/>
$q = iconv("utf-8", "windows-1251", $q);<br/>
$result = exec('echo "'.$q.'" | mystem.exe -i -e cp866');<br/>
$result = iconv("cp866", "utf-8", $result);<br/>
return $result;<br/>
}<br/>
<br/>
header("Content-type: text/html; charset=utf-8");<br/>
echo mystem('в мурелки шлепают пельсиски');<br/>
?><br/>
Для меня все же осталось загадкой, почему в скрипт отдается строка в windows-1251, а указывается cp866 (а не cp1251, что вроде как правильно), но задача решена.
То, что скрипт не корректно отрабатывает при
-e utf8, видимо, косяк mystem, т.к. с файлами в этой кодировке он справляется без проблем.