Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
3-10126
polluks
2003-07-15 10:27
2003.08.04
Создание dbf


4-10491
dimonf
2003-05-30 19:54
2003.08.04
Как запретить одновременный запуск нескольких копий окна???


14-10459
Knight
2003-07-17 22:38
2003.08.04
Кто знает, что за ошибка?


1-10271
electric
2003-07-21 18:18
2003.08.04
Выделенные строки в ListView.


4-10500
DMN
2003-05-30 08:28
2003.08.04
Каталоги несчастные!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский