помогите разобрать программу определения кодировки текста.

bodr_07

Новичок
помогите разобрать программу определения кодировки текста.

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

setlocale(LC_CTYPE, 'ru_RU');

$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');

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];
}

$r = 'none';
$tmp = max($t_win, $t_koi, $t_iso, $t_dos);
if ($t_win == $tmp) $r = 'w';
if ($t_koi == $tmp) $r = 'k';
if ($t_iso == $tmp) $r = 'i';
if ($t_dos == $tmp) $r = 'a';

return $r;
}
?>
меня интерессуют последних 2 блока начиная с oreach($t as $k => $v)
 

Вурдалак

Продвинутый новичок
Очевидно, здесь что-то вроде реализации идентификации исходного алфавита по имеющимся таблицам частот появления букв.

Только смущает это:
PHP:
setlocale(LC_CTYPE, 'ru_RU');
Ну и далее. Тут явно не указывается кодировка, соответственно, от strtolower() можно ждать чего угодно.
 

bodr_07

Новичок
а вот foreach($t as $k => $v) это не могу понять для чего это делается? и что за $v добавляется?
 

Вурдалак

Продвинутый новичок
Код очень грязный. В $k по задумке должна быть буква, в $v — количество её появлений в тексте.
 

bodr_07

Новичок
аа, понятно, а сл блок $tmp = max($t_win, $t_koi, $t_iso, $t_dos);
if ($t_win == $tmp) $r = 'w';
 

mity

Новичок
strtolower использовать не нужно, заглавных букв намного меньше и ими можно пренебречь.

А почему Вы никак не никак не детектируете UTF-8
 

bodr_07

Новичок
а и еще т е он каждуй букву по очередно перемножает на кол во ее появлений...тока для чего? типа из за того что повторения чтоль встречаются в кодировках?

-~{}~ 09.06.10 23:11:

я даже незнаю...мне сказали сделать домашку по этим 4 кодировкам и все)
 

Вурдалак

Продвинутый новичок
А вот что я сделал интереса ради:
PHP:
<?php

function probEncoding($s) {
    
    if( strlen($s) == 0 ) {
        return array();
    }

    static $matrix = array(
        array(0.0000, 0.0089, 0.0803, 0.0433, 0.0607, 0.0014, 0.0204, 0.0882, 0.0015, 0.0000, 0.0876, 0.1222, 0.0383, 0.1470, 0.0000, 0.0236, 0.0964, 0.0162, 0.0820, 0.0007, 0.0015, 0.0053, 0.0072, 0.0288, 0.0115, 0.0052, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0218),
        array(0.0497, 0.0044, 0.0007, 0.0001, 0.0024, 0.1000, 0.0007, 0.0089, 0.0276, 0.0000, 0.0000, 0.0018, 0.0413, 0.0000, 0.2722, 0.0000, 0.0024, 0.0030, 0.0023, 0.0419, 0.0000, 0.0000, 0.0000, 0.0006, 0.0000, 0.0000, 0.0000, 0.0203, 0.0030, 0.0002, 0.0131, 0.0012, 0.4021),
        array(0.0796, 0.0016, 0.0016, 0.0022, 0.0385, 0.0381, 0.0000, 0.0229, 0.0590, 0.0001, 0.0079, 0.0007, 0.0001, 0.0007, 0.1688, 0.0000, 0.0125, 0.0341, 0.0647, 0.0249, 0.0000, 0.0070, 0.0014, 0.0000, 0.0009, 0.0000, 0.0000, 0.0222, 0.0003, 0.0006, 0.0002, 0.0109, 0.3986),
        array(0.0401, 0.0001, 0.0016, 0.0016, 0.0008, 0.1813, 0.0008, 0.0268, 0.0288, 0.0000, 0.0055, 0.0067, 0.0029, 0.0082, 0.2548, 0.0000, 0.0088, 0.0015, 0.0004, 0.0512, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0077, 0.0008, 0.0005, 0.0007, 0.0063, 0.3621),
        array(0.0666, 0.0011, 0.0117, 0.0441, 0.0015, 0.0975, 0.0305, 0.0325, 0.0789, 0.0052, 0.0000, 0.0051, 0.0000, 0.0145, 0.1371, 0.0001, 0.0342, 0.0111, 0.0031, 0.0683, 0.0000, 0.0001, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0047, 0.0167, 0.0184, 0.0093, 0.0279, 0.2799),
        array(0.0178, 0.0315, 0.0654, 0.0128, 0.0613, 0.0140, 0.0523, 0.0053, 0.0265, 0.0003, 0.0072, 0.0562, 0.0614, 0.1445, 0.0270, 0.0308, 0.0822, 0.0435, 0.0750, 0.0028, 0.0053, 0.0057, 0.0107, 0.0467, 0.0254, 0.0151, 0.0007, 0.0128, 0.0036, 0.0000, 0.0000, 0.0018, 0.0543),
        array(0.1156, 0.0010, 0.0003, 0.0000, 0.1573, 0.0780, 0.0006, 0.0065, 0.0353, 0.0000, 0.0027, 0.0434, 0.0001, 0.0054, 0.2246, 0.0000, 0.0284, 0.0076, 0.0001, 0.1326, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0045, 0.0001, 0.0000, 0.0014, 0.0159, 0.1387),
        array(0.2430, 0.0002, 0.0449, 0.0000, 0.0010, 0.0670, 0.0000, 0.0016, 0.1238, 0.0001, 0.0064, 0.0019, 0.0000, 0.0033, 0.0868, 0.0000, 0.0031, 0.0010, 0.0002, 0.0191, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0040, 0.0101, 0.0000, 0.0016, 0.0133, 0.3678),
        array(0.0020, 0.0152, 0.0581, 0.0101, 0.0347, 0.0015, 0.0226, 0.0066, 0.0089, 0.0000, 0.0372, 0.1300, 0.0595, 0.1280, 0.0175, 0.0169, 0.1300, 0.0384, 0.0611, 0.0007, 0.0047, 0.0026, 0.0058, 0.0277, 0.0235, 0.0131, 0.0000, 0.0003, 0.0008, 0.0000, 0.0000, 0.0003, 0.1426),
        array(0.0837, 0.0000, 0.0000, 0.0000, 0.0000, 0.2663, 0.0000, 0.0000, 0.0932, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3903, 0.0000, 0.0000, 0.0000, 0.0000, 0.0187, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1383, 0.0000, 0.0031, 0.0016, 0.0034, 0.0015),
        array(0.1523, 0.0054, 0.0063, 0.0059, 0.0079, 0.0349, 0.0032, 0.0070, 0.0584, 0.0189, 0.0019, 0.0128, 0.0068, 0.0093, 0.0778, 0.0037, 0.0121, 0.1182, 0.0234, 0.0316, 0.0000, 0.0000, 0.0003, 0.0166, 0.0218, 0.0000, 0.0000, 0.0068, 0.0344, 0.0046, 0.0015, 0.0034, 0.3126),
        array(0.1903, 0.0221, 0.0133, 0.0394, 0.0144, 0.1103, 0.0004, 0.0102, 0.1263, 0.0028, 0.0176, 0.0152, 0.0031, 0.0001, 0.1331, 0.0160, 0.0075, 0.0679, 0.0067, 0.0517, 0.0013, 0.0032, 0.0000, 0.0008, 0.0139, 0.0000, 0.0000, 0.0457, 0.0000, 0.0064, 0.0007, 0.0201, 0.0596),
        array(0.1013, 0.0013, 0.0050, 0.0001, 0.0015, 0.1371, 0.0002, 0.0145, 0.0860, 0.0041, 0.0003, 0.0003, 0.0024, 0.0000, 0.1732, 0.0000, 0.0344, 0.0458, 0.0016, 0.0493, 0.0001, 0.0063, 0.0000, 0.0000, 0.0009, 0.0000, 0.0000, 0.0401, 0.0070, 0.0058, 0.0005, 0.0130, 0.2681),
        array(0.0527, 0.0075, 0.0193, 0.0070, 0.0265, 0.1111, 0.0162, 0.0311, 0.0547, 0.0055, 0.0110, 0.0063, 0.0307, 0.0423, 0.1416, 0.0029, 0.0192, 0.0221, 0.0192, 0.0095, 0.0000, 0.0078, 0.0000, 0.0146, 0.0057, 0.0005, 0.0000, 0.0016, 0.0278, 0.0014, 0.0006, 0.0095, 0.2940),
        array(0.0005, 0.0231, 0.0600, 0.0693, 0.0416, 0.0021, 0.0016, 0.0056, 0.0083, 0.0001, 0.0790, 0.0587, 0.0430, 0.1035, 0.0028, 0.0990, 0.0869, 0.0263, 0.1324, 0.0001, 0.0030, 0.0233, 0.0030, 0.0010, 0.0034, 0.0001, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1221),
        array(0.0378, 0.0000, 0.0082, 0.0000, 0.0041, 0.0370, 0.0000, 0.0000, 0.0076, 0.0000, 0.0000, 0.0017, 0.0053, 0.0000, 0.0532, 0.0021, 0.0042, 0.0866, 0.0044, 0.0246, 0.0000, 0.0000, 0.0000, 0.0000, 0.0001, 0.0000, 0.0000, 0.0070, 0.0007, 0.0002, 0.0034, 0.0016, 0.7101),
        array(0.1052, 0.0319, 0.0173, 0.0259, 0.0239, 0.1500, 0.0000, 0.0073, 0.0273, 0.0001, 0.0400, 0.0000, 0.0021, 0.0018, 0.1315, 0.1649, 0.0505, 0.0068, 0.0647, 0.0157, 0.0043, 0.0031, 0.0000, 0.0004, 0.0011, 0.0001, 0.0000, 0.0070, 0.0000, 0.0013, 0.0006, 0.0025, 0.1128),
        array(0.0894, 0.0034, 0.0569, 0.0007, 0.0050, 0.0841, 0.0001, 0.0000, 0.0694, 0.0088, 0.0032, 0.0388, 0.0042, 0.0078, 0.1307, 0.0008, 0.0054, 0.0224, 0.0223, 0.0367, 0.0001, 0.0012, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0128, 0.0240, 0.0056, 0.0041, 0.0156, 0.3463),
        array(0.0857, 0.0000, 0.0045, 0.0004, 0.0041, 0.0901, 0.0001, 0.0002, 0.0696, 0.0048, 0.0121, 0.0014, 0.0000, 0.0141, 0.1296, 0.0033, 0.0121, 0.1880, 0.0053, 0.0269, 0.0006, 0.0003, 0.0000, 0.0760, 0.0009, 0.0000, 0.0000, 0.0163, 0.0012, 0.0466, 0.0062, 0.0243, 0.1754),
        array(0.0031, 0.0420, 0.0204, 0.0236, 0.0882, 0.0046, 0.0078, 0.0177, 0.0137, 0.0000, 0.0619, 0.0560, 0.0716, 0.1466, 0.0031, 0.0286, 0.0878, 0.0238, 0.0440, 0.0001, 0.0053, 0.0049, 0.0047, 0.0288, 0.0088, 0.0048, 0.0000, 0.0003, 0.0000, 0.0000, 0.0000, 0.0001, 0.1976),
        array(0.0496, 0.0000, 0.0000, 0.0000, 0.0000, 0.0234, 0.0000, 0.0000, 0.0664, 0.0036, 0.0000, 0.0673, 0.0102, 0.0192, 0.1992, 0.0006, 0.0075, 0.0117, 0.0048, 0.0186, 0.0673, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0400, 0.0042, 0.0000, 0.0000, 0.4062),
        array(0.1206, 0.0077, 0.0036, 0.0000, 0.0061, 0.0548, 0.0000, 0.0000, 0.1918, 0.0016, 0.0443, 0.0000, 0.0001, 0.0003, 0.1031, 0.0001, 0.0217, 0.0284, 0.0015, 0.0564, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0983, 0.0000, 0.0024, 0.0021, 0.0165, 0.2385),
        array(0.0474, 0.0002, 0.0069, 0.0000, 0.0653, 0.0881, 0.0000, 0.0008, 0.3333, 0.0112, 0.0177, 0.0000, 0.0006, 0.1115, 0.0631, 0.0020, 0.0444, 0.0171, 0.0140, 0.0008, 0.0006, 0.0002, 0.0002, 0.0000, 0.0002, 0.0000, 0.0000, 0.0012, 0.0574, 0.0000, 0.0057, 0.0169, 0.0932),
        array(0.0607, 0.0000, 0.0027, 0.0046, 0.0020, 0.0684, 0.0014, 0.0001, 0.0652, 0.0134, 0.0001, 0.0125, 0.0039, 0.0119, 0.1669, 0.0008, 0.0148, 0.0265, 0.0076, 0.0731, 0.0001, 0.0000, 0.0000, 0.0000, 0.0001, 0.0000, 0.0000, 0.0127, 0.0036, 0.0000, 0.0082, 0.0058, 0.4328),
        array(0.0830, 0.0008, 0.0757, 0.0001, 0.0074, 0.1609, 0.0000, 0.0002, 0.0949, 0.0104, 0.0010, 0.0106, 0.0002, 0.0007, 0.1460, 0.0003, 0.0193, 0.0098, 0.0019, 0.0715, 0.0000, 0.0008, 0.0000, 0.0219, 0.0002, 0.0000, 0.0000, 0.0609, 0.0789, 0.0000, 0.0019, 0.0023, 0.1387),
        array(0.1580, 0.0852, 0.0018, 0.0000, 0.0000, 0.2514, 0.0000, 0.0000, 0.0418, 0.0000, 0.0000, 0.0004, 0.0002, 0.0142, 0.0660, 0.0000, 0.0108, 0.0000, 0.0053, 0.0877, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0029, 0.0026, 0.0000, 0.1738, 0.0697, 0.0283),
        array(0.0000, 0.7517, 0.0113, 0.0000, 0.0361, 0.0000, 0.0000, 0.0700, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0023, 0.0000, 0.0000, 0.0000, 0.0926, 0.0293, 0.0000, 0.0000, 0.0068, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000),
        array(0.0000, 0.2360, 0.1421, 0.0000, 0.0296, 0.0000, 0.0000, 0.0184, 0.0000, 0.0000, 0.0000, 0.0547, 0.0677, 0.1797, 0.0000, 0.0333, 0.0815, 0.0167, 0.1283, 0.0000, 0.0019, 0.0002, 0.0098, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0001),
        array(0.0000, 0.0018, 0.0088, 0.0003, 0.0245, 0.0000, 0.0010, 0.0082, 0.0000, 0.0000, 0.0001, 0.2465, 0.0042, 0.0535, 0.0000, 0.0012, 0.0280, 0.2081, 0.3442, 0.0000, 0.0000, 0.0001, 0.0000, 0.0123, 0.0547, 0.0024, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000),
        array(0.0005, 0.0076, 0.0001, 0.0001, 0.0051, 0.0002, 0.0000, 0.0000, 0.0086, 0.0000, 0.0082, 0.0092, 0.0008, 0.0000, 0.0152, 0.0000, 0.0050, 0.0345, 0.0019, 0.0606, 0.0000, 0.0007, 0.0000, 0.0017, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0005, 0.0004, 0.0000, 0.8389),
        array(0.2332, 0.0056, 0.0001, 0.0017, 0.0055, 0.0337, 0.0000, 0.0001, 0.0603, 0.0000, 0.0011, 0.1847, 0.0001, 0.0251, 0.0493, 0.0020, 0.0309, 0.0320, 0.0028, 0.1986, 0.0000, 0.0000, 0.0000, 0.0000, 0.0006, 0.0000, 0.0001, 0.0000, 0.0957, 0.0000, 0.0041, 0.0224, 0.0102),
        array(0.0935, 0.0376, 0.0092, 0.0000, 0.0192, 0.0143, 0.0000, 0.0097, 0.0590, 0.0000, 0.0000, 0.0799, 0.0231, 0.0950, 0.0345, 0.0122, 0.0503, 0.2128, 0.0247, 0.0033, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0082, 0.0007, 0.0106, 0.0000, 0.0000, 0.0054, 0.1968),
        array(0.1123, 0.0031, 0.0355, 0.0035, 0.0086, 0.1002, 0.0025, 0.0093, 0.1050, 0.0360, 0.0268, 0.0507, 0.0411, 0.0241, 0.1491, 0.0002, 0.0059, 0.0247, 0.0278, 0.0320, 0.0001, 0.0150, 0.0008, 0.0003, 0.0004, 0.0000, 0.0000, 0.0316, 0.0613, 0.0000, 0.0118, 0.0802, 0.0000),
    );

    static $lowercase_chars = array
    (
        'windows-1251' => array
        (
            "\xE0", "\xE1", "\xE2", "\xE3", "\xE4", "\xE5", "\xE6", "\xE7",
            "\xE8", "\xE9", "\xEA", "\xEB", "\xEC", "\xED", "\xEE", "\xEF",
            "\xF0", "\xF1", "\xF2", "\xF3", "\xF4", "\xF5", "\xF6", "\xF7",
            "\xF8", "\xF9", "\xFA", "\xFB", "\xFC", "\xFD", "\xFE", "\xFF"
        ),

        'koi8-r' => array
        (
            "\xC1", "\xC2", "\xD7", "\xC7", "\xC4", "\xC5", "\xD6", "\xDA",
            "\xC9", "\xCA", "\xCB", "\xCC", "\xCD", "\xCE", "\xCF", "\xD0",
            "\xD2", "\xD3", "\xD4", "\xD5", "\xC6", "\xC8", "\xC3", "\xDE",
            "\xDB", "\xDD", "\xDF", "\xD9", "\xD8", "\xDC", "\xC0", "\xD1"
        ),

        'CP866' => array
        (
            "\xA0", "\xA1", "\xA2", "\xA3", "\xA4", "\xA5", "\xA6", "\xA7",
            "\xA8", "\xA9", "\xAA", "\xAB", "\xAC", "\xAD", "\xAE", "\xAF",
            "\xE0", "\xE1", "\xE2", "\xE3", "\xE4", "\xE5", "\xE6", "\xE7",
            "\xE8", "\xE9", "\xEA", "\xEB", "\xEC", "\xED", "\xEE", "\xEF"
        ),

        'ISO-8859-5' => array
        (
            "\xD0", "\xD1", "\xD2", "\xD3", "\xD4", "\xD5", "\xD6", "\xD7",
            "\xD8", "\xD9", "\xDA", "\xDB", "\xDC", "\xDD", "\xDE", "\xDF",
            "\xE0", "\xE1", "\xE2", "\xE3", "\xE4", "\xE5", "\xE6", "\xE7",
            "\xE8", "\xE9", "\xEA", "\xEB", "\xEC", "\xED", "\xEE", "\xEF"
        )     
    );

    $charsets = array();

    for($i = 1; $i < strlen($s); $i++) {
        $prob = array();

        foreach($lowercase_chars as $charset => $chars) {

            // Previous character
            $p = mb_strtolower($s[$i - 1], $charset);
            if( ($prev_pos = array_search($p, $chars)) === false ) {
                $prev_pos = 32; // Position of " " (space)
            }

            // Current character
            $c = mb_strtolower($s[$i], $charset);
            if( ($curr_pos = array_search($c, $chars)) === false ) {
                $curr_pos = 32; // Position of " " (space)
            }

            $prob[$charset] = $matrix[$curr_pos][$prev_pos];
        }

        $charsets[array_search(max($prob), $prob)]++;
    }

    arsort($charsets);

    return array_keys($charsets);
}

print_r(probEncoding('Съешь еще этих мягких французских булок да выпей чаю'));
:)

-~{}~ 10.06.10 01:59:

P.S. Матрицу составил по двум большим текстам размером около двух мегабайт. Результат в виде массива наиболее вероятных кодировок (в порядке убывания вероятности).
 

mity

Новичок
Вурдалак гораздо лучше было сначала посчитать сколько раз встречался каждый символ. А затем уже "считать вероятности".
Будет намного быстрее.
 

fixxxer

К.О.
Партнер клуба
это ведь попытка определять кодировку кейворда в реферере? ну так это будет очень хреново работать, ибо кейворды слишком короткие. а ЗАПРОСЫ БЛОНДИНОК практичеки стопудово определятся в кои.

более умно будет посмотрел урл и распарсить квери стринг реферера, и посмотреть на него внимательно. обычно есть прямое или косвенное указание на кодировку.

про utf8 вообще не говорю, ибо детектится элементарно. а всякую хрень типа исо и дос лучше просто выкинуть - оно в живой природе не встречается.
 

Вурдалак

Продвинутый новичок
mity
Нет проблем — покажи свой вариант.

-~{}~ 10.06.10 04:15:

fixxxer
Это всё ради интереса. Так что мимо.
 
Сверху