![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определение кодировки? [D6, 2000]
pathfinder © (2006-05-16 16:34:00)Подскажите пожалуйста, как можно программно определить кодировку?
Johnmen (2006-05-17 15:45:00) [1]// Sha_IsOem определяет кодировку текста по распределению строчных букв.
// Алгоритм использует то, что в тексте на русском языке буквы 'а'..'п'
// встречаются в 2.2-2.4 раза чаще букв 'р'..'я' (70% к 30%).
// Результат: Oem=1, неизвестно=0, Ansi=-1
function Sha_IsOem(sl: TStringList): integer; overload;
var
i, ct, ch: integer;
p, q: pchar;
begin;
ct:=0;
Result:=0;
for i:=sl.Count-1 downto 0 do begin;
p:=pointer(sl[i]);
if p<>nil then begin;
q:=p+pInteger(@p[-4])^;
while p<q do begin;
ch:=byte(p[0]);
if chr(ch)>=chr(14*16) then inc(ct) //Ansi 'а'..'я' или Oem 'р'..'я'
else if byte(ch) and 160=160 then inc(Result); //Oem 'а'..'п'
ch:=byte(p[1]);
if chr(ch)>=chr(14*16) then inc(ct) //Ansi 'а'..'я' или Oem 'р'..'я'
else if byte(ch) and 160=160 then inc(Result); //Oem 'а'..'п'
p:=p+2;
end;
end;
end;
ch:=(Result+ct) shr 2; //Четверть общего количества строчных букв = 0.25 * Count
Result:=Result-(ct shr 1); //Для Oem = 0.55 * Count, для Ansi = - 0.5 * Count
//Если результат по абсолютной величине превосходит четверть общего
//количества строчных букв, то считаем, что кодировка определена успешно.
if (Result>=ch) or (Result<=-ch) then {ok} else Result:=0;
end;
Copyright (c) Sha ©
pathfinder (2006-05-17 15:38:00) [2]Вопрос на самом деле более узкий. Очень хотелось бы программно определять DOS кодировка или WIN.
Desdechado (2006-05-16 16:40:00) [3]частотным анализом по характерным признакам для языков
но гарантий не будет, только вероятности
Сергей М. (2006-05-16 16:39:00) [4]Никак.