![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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% - это невозможно
А вообще - есть яндекс. Таких ф-ций попадалось мне - куча.