Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ANSI или ASCII [D6]


Андрей1 ©   (2004-08-14 10:59:00) 

Доброе утро всем!

Подскажите, существует ли функция определяющая кодировку текста?
Нужно считать текстовый файл, а затем определить в какой кодировке
он написан в ANSI или ASCII.
Огромное спасибо!


leonon   (2004-08-14 13:49:00) [1]

После долгих поисков я написал такую вот функцию:

function CheckWinText(S : string) : boolean;
Var
 I, Count1, Count2 : longint;
 T1, T2, Tmp : string;
Const
 LengthText  = 100;
 RussianText =
  'ть ий ый ат ст ва ны ся ра ро ов ши ен по ит ре ни ка пр ос ив ер вш ан ьс ри ' +
  'ав нн щи ор за во на ко от но ол ле те од ли ти ло вы ск то ес ел ющ ль та ас ' +
  'об тр ет ве йс он ал ин не ар ир ис ие ла ки ик пе аз ме до че аю де ок ев оп ' +
  'чи ом со ви ем ма мо ут ед ди го па ыв из ог ру да ад ну сп кр тв ич ты ят бе ' +
  'ак ля ми га оз бо ьн ек гр оч пи си ам пл бр ча се жи ез сл им ап ия мы нт ус ' +
  'ци тн же ба са ку би ил ой еп ож ур ря аг кл аб зн дн бл рн чн вл ач ту ня зо ' +
  'жа ше це еч ги аж ей хо ры тс уп зи зв лу уд сн ид ша ул сс др иц ио вн уч ег ' +
  'св ду пу гл рт ще уб ае ум ув зд иг кт ца уш су еж лю тк нь бу см ха ыс ох ье ' +
  'му лы ук фи вс зм вк уж ац ящ нс дв нк ип сы еб ах ян ую еш аш ош гн ец мн яв ' +
  'уг ун рм чк ои ща фо нд рк жд рс ыт яю тя ое вр сь ео лк гу ды жн ып зы зр иб ' +
  'хи вя ащ ух дс зе ге зл ыр рг шк оо хл вз чу ык кс ех аф кн тл зу рд лл ущ зг ' +
  'ву их дк ыл иа зб ыш яз рв нц ья нч ай ьк уз яд ищ оф рж фа пы иж ещ шл аи йн ' +
  'хр хн бн яс фе вт рь мп иф бы шн чь оя йш ощ мл ке дл кв яг лн пт ее сч мя пя ' +
  'дя рш оу иш хв рч ьт ыг яж нг сх ют йк пн ср цо еи ых ъе оц ыд рб чо ын эк яч ' +
  'вп як юб ям дп сц бс шт уе ым рх юч ая ыч сш тч ея ау ыб вд фр дч тп мб яе еф ' +
  'зж шь еу дь щу яр тм ыз жу рп мм еа мк сб жо кц жк ьм зя рл тт эл шу зк ях лт ' +
  'рю пс рз фл сг ху пь бщ уа чт дм юр юд шо тд хт рр бм нф пп вь ою ею ью рц дц ' +
  'фу дж тб ъя дш бъ йт хм бк вм лз йм ьц ыж сд бв дт яц сф юн нз вв пч тю эт йд ' +
  'вч зь ьз цв лг дг ьш пк ял бь зъ яб мс бя юк кк лд лч вщ рщ лб мр иу шп зт дд ' +
  'жг жь жм юс дб эр фт оа юм ню ьщ тг ьч юз бд уи лж жж мч ьд кш нв шв лс яп бж ' +
  'щн оэ дз яй уф ао рф ыщ эп юх уй хс ьи юл дю эм съ юш эн чл бт йч цк эс сж тш ' +
  'гч цы вц мь уя зз аэ нщ нж гш гм ьв ьб йц гв мф гк хш ии зш зч хе лв дъ бх бю ' +
  'юж фф йл уц вб жр кз вг тх нш шм сю ьг нр тщ ьо лм тц бц юг уо нх лп чр ьф бч ' +
  'бб хч яш ию гс ыя мц бз юц йо пц эв дх бш хк фс фм пш чм мщ гд хг фн въ эф тз ' +
  'тъ бг щр хп жб чш мв ые вх чв ьп юй йр цу вж тф йб ыц жл мт тж йщ йф уэ шю зю ' +
  'яи мг юп ъю фы ыу ыи мш';
begin
 // Получаем тестируемые строки
 if Length(Trim(S))>LengthText then
   T1 := Copy(Trim(S), 1, LengthText) else T1 := Trim(S);
 T2 := OemToAnsiStr(T1);
 // Преобразовываем текст к нижнему регистру
 T1 := AnsiLowerCase(T1);
 T2 := AnsiLowerCase(T2);
 // Обнуляем счетчики
 Count1 := 0;
 Count2 := 0;
 // Организовываем цикл по числу слогов
 for I:=1 to Length(T1)-1 do begin
   Tmp := Copy(T1, I, 2);
   if Pos(Tmp, RussianText)<> 0 then Inc(Count1);
   Tmp := Copy(T2, I, 2);
   if Pos(Tmp, RussianText)<> 0 then Inc(Count2);
 end;
 // Результат
 Result := Count1 >= Count2;
end;


Cobalt   (2004-08-14 13:46:00) [2]

2 Anatoly Podgoretsky ©   (14.08.04 11:03) [1]
Есть интересная страничка, мне очень понравилась, рекомендую всем:
http://koi8.pp.ru/prosto.html


Sergey Kaminski   (2004-08-14 13:35:00) [3]

>> Anatoly Podgoretsky ©   (14.08.04 13:01) [6]

Ох, вот что случается, когда неразобравшись вставляешь куски чужого кода :(


Anatoly Podgoretsky   (2004-08-14 13:01:00) [4]

Это не будет работать, поскольку 'А'..'Я','а'..'я'] входит как подмножество в #$A0..#$EF, а условие построено ка if then else


Sergey Kaminski   (2004-08-14 12:31:00) [5]

Сорри, тип возвр. результата Boolean


Sergey Kaminski   (2004-08-14 12:29:00) [6]

ну, если так простенько "в лоб", по статистике, то для русских текстов сойдет и нечто в таком роде:


function IsStringANSI(S: string): TTextCodePage;
type
 CharSet = set of char;
const
 cp1251Set: CharSet = ['А'..'Я','а'..'я'];
 cp866Set: CharSet  = [ #$80..#$9F,#$A0..#$EF];
var
 i: Integer;
 Ch: Char;
 cp1251Counter,
 cp866Counter: Integer;
begin
 cp1251Counter := 0;
 cp866Counter := 0;
 Result := cpDefault;

 for i := 1 to Length(S) do
 begin
   if S[I] in cp1251Set then
     Inc (cp1251Counter)
   else
     if S[I] in cp866Set then
       Inc (cp866Counter);
 end;

 Result := (cp1251Counter > cp866Counter);
end;


TUser   (2004-08-14 11:21:00) [7]

Вроде даже на этом сайте был такой компонент.


Anatoly Podgoretsky   (2004-08-14 11:03:00) [8]

Нет и это задача для искусственного интеллекта, все остальные методы на основе статистики или анализа кодов не являются достоверными. Может ты позволишь это пользователю, как это сделано в браузерах и постовиках?


KSergey   (2004-08-14 11:03:00) [9]

На 100% - это невозможно
А вообще - есть яндекс. Таких ф-ций попадалось мне - куча.


Наверх

Титульная страница Поиск, карта сайта Написать письмо