Как определить что текст в юникоде

R_S_S_S

Новичок
Как определить что текст в юникоде

У меня есть такой код PHP:

PHP:
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);
}
Но проблема в том что часто поподается Юникод, как можно модифицировать функцию, что бы она определяла Юникод?

-~{}~ 06.03.06 18:07:

Или если кто знает то какую ни будь другую функцию?
 

R_S_S_S

Новичок
Спасибо Фанат, если не что скину доп. вопрос.

-~{}~ 06.03.06 20:29:

Вот первая проблема:

PHP:
<?php
function is_ruUTF8($str) { // Функция определяет "похожесть" строки на русскую UTF8 (C) SiMM
    return !preg_replace('#[\x00-\x7F]|\xD0[\x81\x90-\xBF]|\xD1[\x91\x80-\x8F]#s', '', $str );
}
?>
Он правильно опеределяет если весть текст является utf-8, а вот если он смещанный к примеру с html тегами, выдаёт ошибку, как этого исправить?

-~{}~ 06.03.06 20:31:

Добавлю ещё, что detect_cyr_charset определяет такой тип как ISO
 

R_S_S_S

Новичок
Погрешность всё равно останится, скажем текст от JS , картиннки или комента и т.д..

PHP:
function detect_encoding($text, $short = 1) {
    /*
    returns:
    none - encoding not detected
    w  - windows-1251
    k  - KOI8-R
    i  - ISO
    a  - DOS 866
    */



    $x_win = array('а'=>'0.07890365448505', 'б'=>'0.013981173864895', 'в'=>'0.043050941306755', 'г'=>'0.018687707641196', 'д'=>'0.027685492801772', 'е'=>'0.089285714285714', 'ж'=>'0.0094130675526024', 'з'=>'0.01578073089701', 'и'=>'0.071151716500554', 'й'=>'0.013427464008859', 'к'=>'0.038898117386489', 'л'=>'0.044435215946844', 'м'=>'0.032392026578073', 'н'=>'0.072120708748616', 'о'=>'0.11600221483942', 'п'=>'0.024363233665559', 'р'=>'0.040420819490587', 'с'=>'0.054817275747508', 'т'=>'0.063538205980066', 'у'=>'0.024363233665559', 'ф'=>'0.0016611295681063', 'х'=>'0.0080287929125138', 'ц'=>'0.0038759689922481', 'ч'=>'0.017303433001107', 'ш'=>'0.008859357696567', 'щ'=>'0.0024916943521595', 'ъ'=>'0.00027685492801772', 'ы'=>'0.018410852713178', 'ь'=>'0.017995570321152', 'э'=>'0.002906976744186', 'ю'=>'0.0065060908084164', 'я'=>'0.018964562569214');
    $x_koi = array('б'=>'0.07890365448505', 'в'=>'0.013981173864895', 'Ч'=>'0.043050941306755', 'з'=>'0.018687707641196', 'д'=>'0.027685492801772', 'е'=>'0.089285714285714', 'Ц'=>'0.0094130675526024', 'Ъ'=>'0.01578073089701', 'й'=>'0.071151716500554', 'к'=>'0.013427464008859', 'л'=>'0.038898117386489', 'м'=>'0.044435215946844', 'н'=>'0.032392026578073', 'о'=>'0.072120708748616', 'п'=>'0.11600221483942', 'Р'=>'0.024363233665559', 'Т'=>'0.040420819490587', 'У'=>'0.054817275747508', 'Ф'=>'0.063538205980066', 'Х'=>'0.024363233665559', 'ж'=>'0.0016611295681063', 'и'=>'0.0080287929125138', 'г'=>'0.0038759689922481', 'Ю'=>'0.017303433001107', 'Ы'=>'0.008859357696567', 'Э'=>'0.0024916943521595', 'Я'=>'0.00027685492801772', 'Щ'=>'0.018410852713178', 'Ш'=>'0.017995570321152', 'Ь'=>'0.002906976744186', 'а'=>'0.0065060908084164', 'С'=>'0.018964562569214');
    $x_iso = array('Р'=>'0.07890365448505', 'С'=>'0.013981173864895', 'Т'=>'0.043050941306755', 'У'=>'0.018687707641196', 'Ф'=>'0.027685492801772', 'Х'=>'0.089285714285714', 'Ц'=>'0.0094130675526024', 'Ч'=>'0.01578073089701', 'Ш'=>'0.071151716500554', 'Щ'=>'0.013427464008859', 'Ъ'=>'0.038898117386489', 'Ы'=>'0.044435215946844', 'Ь'=>'0.032392026578073', 'Э'=>'0.072120708748616', 'Ю'=>'0.11600221483942', 'Я'=>'0.024363233665559', 'а'=>'0.040420819490587', 'б'=>'0.054817275747508', 'в'=>'0.063538205980066', 'г'=>'0.024363233665559', 'д'=>'0.0016611295681063', 'е'=>'0.0080287929125138', 'ж'=>'0.0038759689922481', 'з'=>'0.017303433001107', 'и'=>'0.008859357696567', 'й'=>'0.0024916943521595', 'к'=>'0.00027685492801772', 'л'=>'0.018410852713178', 'м'=>'0.017995570321152', 'н'=>'0.002906976744186', 'о'=>'0.0065060908084164', 'п'=>'0.018964562569214');
    $x_dos = array(' '=>'0.07890365448505', 'с'=>'0.013981173864895', 'т'=>'0.043050941306755', 'у'=>'0.018687707641196', 'ф'=>'0.027685492801772', 'х'=>'0.089285714285714', 'ц'=>'0.0094130675526024', 'ч'=>'0.01578073089701', 'ш'=>'0.071151716500554', 'щ'=>'0.013427464008859', 'ъ'=>'0.038898117386489', 'ы'=>'0.044435215946844', 'ь'=>'0.032392026578073', '_'=>'0.072120708748616', 'ю'=>'0.11600221483942', 'я'=>'0.024363233665559', 'а'=>'0.040420819490587', 'б'=>'0.054817275747508', 'в'=>'0.063538205980066', 'г'=>'0.024363233665559', 'д'=>'0.0016611295681063', 'е'=>'0.0080287929125138', 'ж'=>'0.0038759689922481', 'з'=>'0.017303433001107', 'и'=>'0.008859357696567', 'й'=>'0.0024916943521595', 'к'=>'0.00027685492801772', 'л'=>'0.018410852713178', 'м'=>'0.017995570321152', 'н'=>'0.002906976744186', 'о'=>'0.0065060908084164', 'п'=>'0.018964562569214');
    $x_utf8 = array(' '=>'0.07890365448505', 'с'=>'0.013981173864895', 'т'=>'0.043050941306755', 'у'=>'0.018687707641196', 'ф'=>'0.027685492801772', 'х'=>'0.089285714285714', 'ц'=>'0.0094130675526024', 'ч'=>'0.01578073089701', 'ш'=>'0.071151716500554', 'щ'=>'0.013427464008859', 'ъ'=>'0.038898117386489', 'ы'=>'0.044435215946844', 'ь'=>'0.032392026578073', '_'=>'0.072120708748616', 'ю'=>'0.11600221483942', 'я'=>'0.024363233665559', 'а'=>'0.040420819490587', 'б'=>'0.054817275747508', 'в'=>'0.063538205980066', 'г'=>'0.024363233665559', 'д'=>'0.0016611295681063', 'е'=>'0.0080287929125138', 'ж'=>'0.0038759689922481', 'з'=>'0.017303433001107', 'и'=>'0.008859357696567', 'й'=>'0.0024916943521595', 'к'=>'0.00027685492801772', 'л'=>'0.018410852713178', 'м'=>'0.017995570321152', 'н'=>'0.002906976744186', 'о'=>'0.0065060908084164', 'п'=>'0.018964562569214');

    if ($short) $text = substr($text, 0, 200);

    $len = strlen($text);
    for ($i = 0;$i < $len;$i++) {
        $let = strtolower($text[$i]);
        $t[$let]++;
    }

    if (is_array($t))
    foreach($t as $k => $v) {
        $t_win += $v * $x_win[$k];
        $t_koi += $v * $x_koi[$k];
        $t_iso += $v * $x_iso[$k];
        $t_dos += $v * $x_dos[$k];
        $t_utf8 += $v * $x_utf8[$k];
    }

    $r = false;
    $tmp = max($t_win, $t_koi, $t_iso, $t_dos, $t_utf8);
    echo $tmp;
    if ($t_win == $tmp) $r = 'w';
    if ($t_koi == $tmp) $r = 'k';
    if ($t_iso == $tmp) $r = 'i';
    if ($t_dos == $tmp) $r = 'a';
    if ($t_utf8 == $tmp) $r = 'u';

    return $r;
}
Т.е. сделать новые весовые параметры для $t_utf8, utf8 тоже имеет уникальные биты.
Но здесь для меня проблема как определяеться массивы вессов, типа $t_win?

-~{}~ 06.03.06 22:40:

C mb_detect_encoding($document,"Windows-1251,KOI8-R,ISO-8859-5,UTF-8");
то же облом Юникод с тегами определяет как ISO-8859-5
 

SiMM

Новичок
> Он правильно опеределяет если весть текст является utf-8, а вот если он смещанный к примеру с html тегами, выдаёт ошибку, как этого исправить?
По-моему, ты лжёшь.
 

kvf77

Red Devil
R_S_S_S

фигня - причем тут html теги? они в UTF-8 хранятся как latin1 - то есть никакой проблемы не должно быть.

О, сорри, SiMM уже об этом написал
 

SiMM

Новичок
> причем тут html теги? они в UTF-8 хранятся как latin1
Как ASCII, если быть точнее ;) Ибо для HTML-тэгов достаточно и 7мибитной кодировки.
 

kvf77

Red Devil
SiMM

я это и имел ввиду - просто мне показалась такая формулировка более доступной :)
 
Сверху