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

Форум Регулярные Выражения

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Определить кодировку текста

Сообщения:  [1-10]    [11-20]  [21-27] 

 
 автор: .....   (10.07.2011 в 22:52)
 
   для: Deed   (10.07.2011 в 22:23)
 

То.что юзер вводит текст в форме с Вашей странички, (и если кодировку странице задаёт браузер а не юзер), в какой.то степени может принуждать отсылать утф.8.

Сложность в том что например кириллический алфавит это русский, украинский, беларусский, сербский, ... и многие другие языки. Символы это всего.лишь символы, но есть исключения (то что например отделены идентичные печатные символы в латинице )

  Ответить  
 
 автор: Deed   (10.07.2011 в 22:29)   письмо автору
 
   для: 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);
   }
   
?>

  Ответить  
 
 автор: Deed   (10.07.2011 в 22:23)   письмо автору
 
   для: .....   (10.07.2011 в 22:06)
 

Та да :)
http://forum.grodno.net/index.php?topic=61739.0

  Ответить  
 
 автор: Deed   (10.07.2011 в 22:22)   письмо автору
 
   для: 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

если язык текста неизвестен, однобайтные кодировки различимы ... перебором всех кодировок и узнаванием знакомых слов :)

  Ответить  
 
 автор: Valleri   (10.07.2011 в 21:14)   письмо автору
 
   для: cheops   (10.07.2011 в 21:02)
 

Я примера не могу подобрать, не найти таблицы соответствия.
Любая задача решается в постановке. Математики говорят, прежде чем решать задачу надо прочитать условия.
Один символ - не бросается в глаза, его не пропустит ограничение по длине. А вот в сотне символах, хоть один найдется.
Кстати ваше решение
$pattern = '#\b[^\s\dа-яa-z]+\b#is'

Не пропускает вроде символы
Вызов РѕР±С‰РµРґРѕСЃС‚СѓРїРЅРѕРіРѕ 

Ваше решение обладает некоторой универсальностью, это уже плюс. Оно не обладает всеобщей божественной универсальностью. Но оно решает задачу в постановке. Дальнейшая точность может требует огромных усилий а может и нет
Я не ас, мне трудно подбирать слова и объяснения для понимания, но вроде работает
Сами машинные коды наверное не играют роли похоже для понимания, важно что
$pattern = '#\b[^\s\dа-яa-z]+\b#is'

Не может пропустить краказябры
(Кажется запуталось все)

  Ответить  
 
 автор: cheops   (10.07.2011 в 21:06)   письмо автору
 
   для: Valleri   (10.07.2011 в 20:32)
 

>Я поищу коды и их символы и попробую понять.
Искать их не обязательно берите любую строку - это массив символов, код символа можно получить при помощи функции ord().

  Ответить  
 
 автор: cheops   (10.07.2011 в 21:02)   письмо автору
 
   для: Valleri   (10.07.2011 в 20:32)
 

Это 242, 32 - это пробел. Можно, конечно, попытаться, но что вы будете делать, если у вас в руках окажется один символ? Все-равно задача имеет ограничения и требует мало-мальски хоть какого-то объемного текста.

  Ответить  
 
 автор: Valleri   (10.07.2011 в 20:32)   письмо автору
 
   для: cheops   (10.07.2011 в 19:32)
 

Я не могу сходу привести пример, но из вашего примера попробую пояснить или прояснить себе

в Windows-866, машина достает таблицу кодировки и пишет
&#9575;ЁштхЄ ьшЁ!

Є эта буква не читабельна.
Наверное это 32 и может быть в Windows-866 нет такого кода.
или
ї

Я не знаю какой код у этой краказябры, но в Windows-1251 нет такой буквы, так как наверное нет такого кода Windows-1251
Я поищу коды и их символы и попробую понять.

  Ответить  
 
 автор: cheops   (10.07.2011 в 19:32)   письмо автору
 
   для: Valleri   (10.07.2011 в 19:13)
 

А как вы определите без человека, что они не читабельны? Машина видит цифры - для неё все символы читабельны, так как каждый такой символ - это число (причем с этим числом связано несколько символов из разных кодировок, которые можно однозначно выбрать, только если задана кодировка). Вернее даже не так, она видит только числа и их последовательность - символы ей нужны, чтобы мы понимали результат её работы, ей самой они нафиг не вперлись - лишние вычисления. То что вы сходу определяете читаем текст или нет является результатом 4-млрд эволюции, зрения, распознавания образов, разума, и его многолетнего обучения. Компьютеры по другому устроены, научить их распознавать образы довольно тяжело. Да и глупо преобразовывать текст в растр и решать задачу распознавания образов. Обычно такие штуки строят на патернах, словарях... однако, если текста мало или если текст одинаков для разных кодировок - задачу вообще нельзя решить. Если бы эта задача решалась элементарно, то в HTML не нужно было бы указывать кодировку с META-тэге, а браузер не содержал бы внушительные инструменты для управления кодировкой. Есть библиотеки, которые решают данную задачу (когда это возможно), но они не без греха. Понятно, что в русском языке одни символы часто следуют после других, одни символы никогда не могут следовать после други (жи, ши пиши с и...), однако и грамматические ошибки исключать нельзя. В общем задача довольно серьезная и однозначного решения не имеет. Вот есть однобайтовое число (код) 47 - какая это кодировка? Да какая угодно.

  Ответить  

Сообщения:  [1-10]    [11-20]  [21-27] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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