Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.04;
Скачать: CL | DM;

Вниз

Автоопределение кодировки...   Найти похожие ветки 

 
Someone Who Need You Help   (2003-07-19 21:09) [0]

Уважаемые спецы!!!
Помогите пожалуйста с функцией, которая будет автоматически определять кодировку исходного текста (WIN, KOI, DOS, ISO)!!!
Ну очень надо!!! Настолько надо, что предоставившему рабочую функцию могу пообещать 7-значную аську... :) Заранее спасибо!!!


 
Marser ©   (2003-07-19 22:18) [1]

const
l3_csANSI = 0;
{-признак кодировки ANSII}
l3_csOEM = 255;
{-признак кодировки OEM}

type
cc_Graph_CriteriaRange = #176..#223; {-критерий для определения псевдографики}
TChars = set of char;
Long = LongInt;

const
cc_OEM_CriteriaEx = [#128..#175] + [#224..#239];
cc_ANSI_CriteriaEx = [#192..#255];
cc_Graph_Criteria = [Low(cc_Graph_CriteriaRange)..High(cc_Graph_CriteriaRange)];

type
T_cc_GraphCounts = array [cc_Graph_CriteriaRange] of Longint;

procedure l3AnalizeCharSetEx(var Buf: PChar; BufEnd: PChar;
var OEMCount, ANSICount, GraphCount: Long;
var GraphCounts: T_cc_GraphCounts);
var
C : Char;
begin
OEMCount := 0;
ANSICount := 0;
GraphCount := 0;
for C := Low(T_cc_GraphCounts) to High(T_cc_GraphCounts) do GraphCounts[C] := 0;
while (Buf < BufEnd) do begin
C := Buf^;
Inc(Buf);
if (C in cc_OEM_CriteriaEx) then Inc(OEMCount);
if (C in cc_ANSI_CriteriaEx) then Inc(ANSICount);
if (C in cc_Graph_Criteria) then begin
Inc(GraphCounts[C]);
Inc(GraphCount);
end;
end;{Buf < BufEnd}
end;

function l3AnalizeCharSetExEx(Buf, BufEnd: PChar): Byte;
var
OEMCount : Long;
ANSICount : Long;
GraphCount : Long;
GraphCount_2: Long;
GraphCounts : T_cc_GraphCounts;
C : Char;
begin
l3AnalizeCharSetEx(Buf, BufEnd, OEMCount, ANSICount, GraphCount,GraphCounts);
if (OEMCount > ANSICount) then
Result := l3_csOEM
else if (GraphCount > = ANSICount) then begin
Result := 0;
GraphCount_2 := GraphCount div 2;
for C := Low(T_cc_GraphCounts) to High(T_cc_GraphCounts) do begin
If (GraphCounts[C] > GraphCount_2) then begin
Result := l3_csOEM;
break;
end;{GraphCounts[C] > ..}
end;{for C}
end else Result := 0;
end;

function l3AnalizeCharSetBuf(Buf: PChar; Len: Long): Byte;
begin
Result := l3AnalizeCharSetExEx(Buf, Buf + Len);
end;


 
Marconi ©   (2003-07-19 22:43) [2]

а если у меня уже 7 знаков...6 или 5 дашь?


 
Someone Who Need You Help   (2003-07-19 23:15) [3]

> To Marser
Но это, кажется, ANSII и OEM... А мне надо WIN, KOI, DOS, ISO. Может я, конечно, чего-то и не понимаю...

> To Marconi
За это нет... :) Шестизнак за другую функцию дам по работе с памятью, если интересно - пиши на мыло.


 
Marser ©   (2003-07-19 23:35) [4]


> ANSII

Вобще-то, это то же, что и ASCII, но все равно правильно ANSI.
Что я могу сказать? Насчет KOI8 могу подсказать - плясать нужно от факта, что при обычном прочтении заглавных букв там будет намного больше чем строчных.


 
Marconi ©   (2003-07-19 23:45) [5]

http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=4843
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988622333&n=19



 
Someone Who Need You Help   (2003-07-20 00:05) [6]

> To Marser:
Тама написано:
---
Или воспользоваться стандартными WinAPI, но таких только для DOS <--> Win
---
А мне надо WIN, KOI, DOS, ISO... То, на что ты линки дал я и сам через Гугл нашел... Только мне это не подходит.


 
Marconi ©   (2003-07-20 00:08) [7]

помойму со словариком самый дельный вариант, хотя и не самый надежный


 
Marser ©   (2003-07-20 00:22) [8]


> Someone Who Need You Help (20.07.03 00:05)

Есть ещё вариант - используй частотные таблицы. Для больших текстов самое то. Например, чаще всех встречается буква "О" и т.д. Поищи по Сети.


 
Someone Who Need You Help   (2003-07-20 00:27) [9]

> To Marser и Marconi:
Товарищи! Вся беда не в том, что я искать не умею, просто именно с подобным я никогда не работал и просто мудрым советом меня на путь истинный не полставить - дороги не разберу. Поэтому я сюда и обратился за помощью...


 
Marser ©   (2003-07-20 00:51) [10]

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



Страницы: 1 вся ветка

Текущий архив: 2003.08.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
1-10285
cjiohobaji
2003-07-22 05:30
2003.08.04
New page


14-10371
AlexRush
2003-07-16 17:40
2003.08.04
Решаем глобальные проблемы человечества.... модераторов судим...


1-10213
Still Swamp
2003-07-20 14:41
2003.08.04
Перехват cобытий и передача их в MyObject


8-10314
sndanil
2003-04-14 14:43
2003.08.04
Hint на графике


1-10256
Hollander
2003-07-19 22:56
2003.08.04
В системе открыли файл моей прогой...