|
|
автор: ..... (10.07.2011 в 22:52) |
|
|
для: Deed
(10.07.2011 в 22:23)
| | То.что юзер вводит текст в форме с Вашей странички, (и если кодировку странице задаёт браузер а не юзер), в какой.то степени может принуждать отсылать утф.8.
Сложность в том что например кириллический алфавит это русский, украинский, беларусский, сербский, ... и многие другие языки. Символы это всего.лишь символы, но есть исключения (то что например отделены идентичные печатные символы в латинице ) | |
|
|
|
|
|
|
|
для: cheops
(10.07.2011 в 21:06)
| |
<?
define('LOWERCASE',3);
define('UPPERCASE',1);
function detect_cyr_charset($str) {
$charsets = Array(
'k' => 0,
'w' => 0,
'd' => 0,
'i' => 0,
'm' => 0
);
for ( $i = 0, $length = strlen($str); $i < $length; $i++ ) {
$char = ord($str[$i]);
//non-russian characters
if ($char < 128 || $char > 256) continue;
//CP866
if (($char > 159 && $char < 176) || ($char > 223 && $char < 242))
$charsets['d']+=LOWERCASE;
if (($char > 127 && $char < 160)) $charsets['d']+=UPPERCASE;
//KOI8-R
if (($char > 191 && $char < 223)) $charsets['k']+=LOWERCASE;
if (($char > 222 && $char < 256)) $charsets['k']+=UPPERCASE;
//WIN-1251
if ($char > 223 && $char < 256) $charsets['w']+=LOWERCASE;
if ($char > 191 && $char < 224) $charsets['w']+=UPPERCASE;
//MAC
if ($char > 221 && $char < 255) $charsets['m']+=LOWERCASE;
if ($char > 127 && $char < 160) $charsets['m']+=UPPERCASE;
//ISO-8859-5
if ($char > 207 && $char < 240) $charsets['i']+=LOWERCASE;
if ($char > 175 && $char < 208) $charsets['i']+=UPPERCASE;
}
arsort($charsets);
return key($charsets);
}
?>
|
| |
|
|
|
|
|
|
|
|
для: cheops
(10.07.2011 в 16:48)
| | Да есть, в принципе, решение:
http://heel.org.ua/php-functions/mb-detect-encoding.html - mb_detect_encoding | |
|
|
|
|
автор: ..... (10.07.2011 в 22:06) |
|
|
для: Deed
(10.07.2011 в 16:28)
| | В утф.8 (точнее в кодировках представляющих юникод) можно пытаться определить используемые языками алфавиты ... с некоторой долей вероятности, так.же как не всегда по обрывку текста можно утверждать что кодировка утф.8
если язык текста неизвестен, однобайтные кодировки различимы ... перебором всех кодировок и узнаванием знакомых слов :) | |
|
|
|
|
|
|
|
для: cheops
(10.07.2011 в 21:02)
| | Я примера не могу подобрать, не найти таблицы соответствия.
Любая задача решается в постановке. Математики говорят, прежде чем решать задачу надо прочитать условия.
Один символ - не бросается в глаза, его не пропустит ограничение по длине. А вот в сотне символах, хоть один найдется.
Кстати ваше решение
$pattern = '#\b[^\s\dа-яa-z]+\b#is'
|
Не пропускает вроде символы
Вызов общедоступного
|
Ваше решение обладает некоторой универсальностью, это уже плюс. Оно не обладает всеобщей божественной универсальностью. Но оно решает задачу в постановке. Дальнейшая точность может требует огромных усилий а может и нет
Я не ас, мне трудно подбирать слова и объяснения для понимания, но вроде работает
Сами машинные коды наверное не играют роли похоже для понимания, важно что
$pattern = '#\b[^\s\dа-яa-z]+\b#is'
|
Не может пропустить краказябры
(Кажется запуталось все) | |
|
|
|
|
|
|
|
для: Valleri
(10.07.2011 в 20:32)
| | >Я поищу коды и их символы и попробую понять.
Искать их не обязательно берите любую строку - это массив символов, код символа можно получить при помощи функции ord(). | |
|
|
|
|
|
|
|
для: Valleri
(10.07.2011 в 20:32)
| | Это 242, 32 - это пробел. Можно, конечно, попытаться, но что вы будете делать, если у вас в руках окажется один символ? Все-равно задача имеет ограничения и требует мало-мальски хоть какого-то объемного текста. | |
|
|
|
|
|
|
|
для: cheops
(10.07.2011 в 19:32)
| | Я не могу сходу привести пример, но из вашего примера попробую пояснить или прояснить себе
в Windows-866, машина достает таблицу кодировки и пишет
Є эта буква не читабельна.
Наверное это 32 и может быть в Windows-866 нет такого кода.
или
Я не знаю какой код у этой краказябры, но в Windows-1251 нет такой буквы, так как наверное нет такого кода Windows-1251
Я поищу коды и их символы и попробую понять. | |
|
|
|
|
|
|
|
для: Valleri
(10.07.2011 в 19:13)
| | А как вы определите без человека, что они не читабельны? Машина видит цифры - для неё все символы читабельны, так как каждый такой символ - это число (причем с этим числом связано несколько символов из разных кодировок, которые можно однозначно выбрать, только если задана кодировка). Вернее даже не так, она видит только числа и их последовательность - символы ей нужны, чтобы мы понимали результат её работы, ей самой они нафиг не вперлись - лишние вычисления. То что вы сходу определяете читаем текст или нет является результатом 4-млрд эволюции, зрения, распознавания образов, разума, и его многолетнего обучения. Компьютеры по другому устроены, научить их распознавать образы довольно тяжело. Да и глупо преобразовывать текст в растр и решать задачу распознавания образов. Обычно такие штуки строят на патернах, словарях... однако, если текста мало или если текст одинаков для разных кодировок - задачу вообще нельзя решить. Если бы эта задача решалась элементарно, то в HTML не нужно было бы указывать кодировку с META-тэге, а браузер не содержал бы внушительные инструменты для управления кодировкой. Есть библиотеки, которые решают данную задачу (когда это возможно), но они не без греха. Понятно, что в русском языке одни символы часто следуют после других, одни символы никогда не могут следовать после други (жи, ши пиши с и...), однако и грамматические ошибки исключать нельзя. В общем задача довольно серьезная и однозначного решения не имеет. Вот есть однобайтовое число (код) 47 - какая это кодировка? Да какая угодно. | |
|
|
|
|