Pull to refresh

Comments 38

А толку, если это с правилами русского языка не согласуется?
Вот правила: gramota.ru/spravka/rules/? rub=perenos
Если написано нельзя — значит и не надо оправдывать неправильные переносы. Лучше вообще не переносить, чем переносить чёрт знает как.
По моему увидев перенос «хоккей — 141143 — хо-ккей;» мало кто поверит, что надо «хо-ккей» а не привычное «хок-кей». И я побоюсь использовать такие переносы.
ну, привычнее, не привычнее, но это правильно. погуглите на тему «принцип восходящей звучности»
Так вон же выше ссылку привели на правила:

7. Нельзя оставлять в конце строки или переносить в начало следующей две одинаковые согласные, стоящие между гласными.

То есть «хок-кей» правильно, а «хо-ккей» — неправильно.
так в примере речь не про перенос а про слогораздел. наверное, я нелостаточно чётко выразился. слогораздел и перенос слов разные вещи. а что программа перенсёт слово не так, это да. но в коце сатьи я написал, что в принципе, эту бадягу можно обойти правилами на основе регулярных выражений. а реализацию оставил вам на сладкое. сам тоже над ней работаю =)
это с правилами русского языка согласовано: слогораздел именно так и происходит. А перенос слов по слогам вполне возмоден. Читайте: www.gramma.ru/RUS/? id=4.21
>> Недавно я столкнулся с проблемой реализации переноса слов средствами PHP.
Вот это и наводит на мысль что не слогораздел а именно перенос по слогам =)
ну да, такой способ переноса слов в принципе возможен [ www.gramma.ru/RUS/? id=4.21 ]. и для него принципиален слогораздел))
UFO just landed and posted this here
спасибо за линк. я просто пытался реализовать всё в максиамльном соответсвии с правилами слогораздела. мой первоначальный алгоритм работал более чётко, но он расставлял переносы после всех гласных а потом прогонял вывод по регулярным выражениям. получается, принёс удобство в жертву «научности» =(
Вообще-то есть специализированный софт для этого дела.
И вот он как раз всё делает по правилам (ну или почти всё).
ну есть то-есть, а где его найти в паблике? я не нашёл, и озадачился. сейчас работаю над реализацией морфемного способа переноса. как сделаю словарь — выложу на хабре.
Наш программист как-то нашёл этот софт.
Одной из его находок был т.н. «лемматизер» aot.ru.
Возможно там же он нашёл и работу со слогами.
спасибо, будем тестить и изучать)
ну есть то-есть, а где его найти в паблике?
Ээээ… Прочитать на Википедии? Там есть и ссылки на статьи и на реализации. Правда для русского нет ничего — это правда.
кстати, скорее всего такой софт работает на основе морфем…
Очень не плохо!
Для лучшего восприятия кода, советую воспользоваться source.virtser.net/
он вроде как php не подсвечивает(
ну можно выбрать C#
php как известно, является не далеким родственником по структуре…

Все равно приятней будет читать код.
Подсветка — это, конечно, здорово, но сейчас код нельзя скопипастить и запустить.
Например, из-за кавычек.
Ну про сам алгоритм написали выше.
Напишу про код — он очень, очень странный.

Зачем переводить строку из cp1251 в юникод и потом жутко извращенным способом отщипывать символы из старой кодировки и переводить в новую, может стоит сразу использовать mb_string?
function win2uni($s) — это вообще очень странная функция, этакий аналог iconv('windows-1251', 'utf-8', $s).

У вас чуть менее чем полностью код состоит из copy-paste. Так писать не следует.
$group_[1-4] сгруппируйте в один массив, если вы все еще так настойчиво сам код сохраняете в кодировке cp1251, а потом переводите символы своим велосипедом в utf8, то либо сохраните наконец-то его в utf8, либо используйте array_map.

Вместо этого ужаса if… elseif… elseif и тд по одной строчке в каждом переделайте код на switch case.
согласен, код не красивый. но вылизывать его не хватило терпения, хотелось побыстрее написать на хабр, как тока он заработал…
И да, сравните количество кода. Чувствуете разницу?
А если уж очень хочется true-utf-compliance, то одноименные функции для работы со строками взять из библиотеки mb_string, кода больше не станет.
упс, опечатка, щас исправлю…
Да что там скрипт, даже с поиском алгоритма возникли трудности
Аааа… Держите меня семеро. Ну сколько нужно времени чтобы найти суперсекретную статью в ультранедоступном источнике с названием Wikipedia? Версии для PHP там нет, правда (есть где руки кодеру размять, да), но есть для Perl и Ruby. Таблицы для русского языка берутся из естественного места.

Оставьте студентов-филологов в покое: всё уже украдено до вас!
Не знаю можно так переносить или нельзя, но выглядит как то неорганично. Особенно «я-стреб». «Яст-реб» как то привычнее (Викисловарь тоже так считает).
Нельзя оставлять одну букву на строке. Алгоритм Кнута это учитывает отдельно. \lefthyphenmin=2 \righthyphenmin=2 для русского, \lefthyphenmin=2 \righthyphenmin=3 для английского…
Вы не путайте орфографию и типографику пожалуйста.
Oops. Я и не заметил что там вообще слово было неправильно разбито на слоги. Посыпаю голову пеплом. Кстати правила для русского языка из babel'я работают хуже, чем для английского — что можно заметить и по количеству исключений (184 для русского и 14 для английского). Но по сравнению с тем, что эти эвристики творят это всё мелочи, конечно…
Ну, в русском таких слов достаточно. «Изображение» или «идиот» например. Насколько я знаю, оставлять одну букву на строке можно, но не принято.
Нельзя. Уже же ссылку давали. Но в случае с яст-ре-бом до этого правила там дело не должно доходить даже. Такой перенос должен отсекаться на уровне разбиения на слоги. У Кнута не доходят.
В общем, при разбиении на слоги одна буква оставаться может, при переносе — нет. А то тут немного свалили в кучу одно и другое.
Sign up to leave a comment.

Articles