Форум: "Основная";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
ВнизНестандартные шрифты Найти похожие ветки
← →
Искандер В. (2006-07-04 15:49) [0][I]Здравствуйте.[/I]
Задание:
Имеется текстовый файл.(из него данные только читаются)
Текст в нем на [B]азербайджанском[/B] языке.
Нужно в виде упорядоченного по убыванию списка,вывести [B]частоту появления букв[/B].
Т.е:
1) - a(16)
2) - r(11)
3) - z(5)
...
...
...
32) - f(0)
Алгоритм подсчета,составить не представляется сложным.
Но я не силен в работе со шрифтами.
Вопросы:
[B]1)[/B]
Зайдя в панель управления,затем в региональные настройки,затем добавив там азербайджанский язык,я т.о. устанавливаю на своем компьютере язык с кодировкой Unicode?
Если да,то стоит ли использовать кодировку Unicode,[U]будет ли она правильно отображаться [/U]в Win2000,если программа составлена на WinXP SP2?
Если нет,то что для этого сделать.
[B]2)[/B]
Можно установить готовый,имеющийся на моем компьютере шрифт Azeri Arial Lat.
Для этого я должен скопировать его в папку: [I]"%windir%\Fonts"[/I] компьютера - пользователя программы.
Надо потом перезагрузить комп???
Как лучше сделать...
Использовать Unicode,или же копировать шрифт?
[B]3)[/B]
Когда я пишу в текстовом редакторе на азербайджанском(установлен через путь,который я описал в пункте #1)
спецефические символы(не имеющие аналогов в кирилице и на латыне) отображаются как "?".
А когда пишу в MS Word"е 2000 Professional,то все нормально.
Что делать,и в чем проблема?
Очень признателен,если кто-то откликнется,буду рад и ссылкам на сайты и фрагментам,и простым советам.
[I]С уважением Искандер В.[/I]
← →
Искандер В. (2006-07-04 17:47) [1]Никто? :-(
← →
guav © (2006-07-04 18:35) [2]> Для этого я должен скопировать его в папку: [I]"%windir%\Fonts"[/I]
> компьютера - пользователя программы.
> Надо потом перезагрузить комп???
> Как лучше сделать...
Для установки шрифта требуется вызвать AddFontResource.
При установке шрифта он будет доступен без перезагрузки - сразу после вызова AddFontResource.
Шрифт можно устанавливать постоянно или временно, при временной установке можно его даже зашить в ресурс программы и устанавливать и использовать оттуда.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_2ylq.asp
← →
Искандер В. (2006-07-04 20:06) [3]Ага,спасибо. :-)
Проделал,фонт установлен.
Еще вопрос с вашего позволения...
Если я делаю проверку символа из текстового файла на равенство определенной букве азербайджанского алфавита,то как ее осуществить???
Т.е.
Грубо говоря, if c = <конкретный символ>.
Все дело в том,что когда я пишу этот сивол в редакторе кода,он отображается как "?".
Т.о. мне придется вместо самого символа,ставить его числовой номер,в функцию Chr.
Но как узнать,каков номер символа азербайджанской раскладки клавиатуры,при данном(установленном при первом запуске проги) шрифте?
← →
Искандер В. (2006-07-04 20:30) [4]Делаю это:
ShowMessage(Chr($00DE));
Он мсне выдает совсем не тот символ,код которого я вижу в углу окна,сервисной программы Windows под названием Таблица символов.
ö
← →
guav © (2006-07-04 21:01) [5]А если поставить именно тот шрифт на, например, TEdit и выполнить
Edit1.Text :=Chr($00DE)
?
← →
Искандер В. (2006-07-04 21:50) [6]Парень...
Я плакалЪ. :-)
Спасибо тебе...
Получилось!!!
Блин...
Сам не сообразил. :-(
С вашей помощью,теперь регестрирую временно шрифт,могу отображать юникодные символы в компанентах VCL.
Осталась последняя часть...
Делаю:Edit1.Font.Name:="Arial AzLat";
x:=TFileStream.Create("C:\Documents and Settings\MakedoneZ\Desktop\Check.txt",fmOpenRead);
x.Read(a,SizeOf(a));
Edit1.Text:=a;
x.Free;
Все же в эдите мне выдает "?",хотя данные в файле и записаны шрифтом Arial AzLat.
← →
guav © (2006-07-04 22:19) [7]> могу отображать юникодные символы в компанентах VCL.
Это вряд ли, если речь идёт о стандартных компонентах VCL для D7.
> x.Read(a,SizeOf(a));
> Edit1.Text:=a;
Здесь следует уточнить тип переменной a.
В файле Check.txt текст написан не в Unicode ?
← →
Искандер В. (2006-07-04 22:42) [8]
> В файле Check.txt текст написан не в Unicode ?
Он написан шрифтом Arial AzLat,который я установил при помощи AddFontResource.
Спутал,он выдает не "?",а одну и ту же букву из этого шрифта,независимо от того,что записано в файле.
← →
guav © (2006-07-04 23:00) [9]Покажите объявление переменной
a
из кода в [6]
← →
Iskander V. (2006-07-05 10:36) [10]Ok...
Na WinXP vsyo normalno rabotaet.
A kogda perenoshu na Win2000,to kodi bukv sbivajutsja.
Ja ved" regestriruyu ispolzovanniy 6rift na komp polzovatelya...
A proga vse ravno putayet kodi,vidayet ne te bukvi...
Eto iz-za rzli4iya platform?
← →
Iskander V. (2006-07-05 10:37) [11]
> объявление переменной a
objavil kakWideChar
.
← →
guav © (2006-07-05 13:53) [12]> objavil kak WideChar.
Это одна юникодная буква. Если текст НЕ-unicode, нужно объявить как Char.
Если WideChar правильно работает с текстом, значит текст unicode.
чтобы прочитать не один символ а более длиную строку, нужен тип string или PChar.
> Na WinXP vsyo normalno rabotaet.
> A kogda perenoshu na Win2000,to kodi bukv sbivajutsja.
Что именно работает на ХР и не работает в 2000 ? Нужен точный код.
← →
Искандер В. (2006-07-05 18:34) [13]
> Это одна юникодная буква. Если текст НЕ-unicode, нужно объявить
> как Char.
> Если WideChar правильно работает с текстом, значит текст
> unicode.
> чтобы прочитать не один символ а более длиную строку, нужен
> тип string или PChar.
Текст юникодный,поэтому использую WideChar.
> Что именно работает на ХР и не работает в 2000 ? Нужен точный
> код.
Вот:
unit Statistics_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfrmMain = class(TForm)
btnOpen: TButton;
odOpen: TOpenDialog;
memResult: TMemo;
procedure btnOpenClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TAzChar = record
letter: WideChar;
count: LongWord;
end;
const nOfChars = 32;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.btnOpenClick(Sender: TObject);
var AzFile: TextFile;
AzChar: array [1..nOfChars] of TAzChar;
c: WideChar;
i: Word;
Result: TextFile;
begin
AddFontResource("ariall.ttf");
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
memResult.Font.Name := "A3 Arial AzLat";
if odOpen.Execute = false then Exit;
AssignFile(AzFile,odOpen.FileName);
Reset(AzFile);
//Инициализация//
for i:=1 to nOfChars do
AzChar[i].count:=0;
AzChar[1].letter := Chr($00C0);
AzChar[2].letter := Chr($00C1);
AzChar[3].letter := Chr($00C2);
AzChar[4].letter := Chr($00C3);
AzChar[5].letter := Chr($00C4);
AzChar[6].letter := Chr($00C5);
AzChar[7].letter := Chr($00C6);
AzChar[8].letter := Chr($00C7);
AzChar[9].letter := Chr($00C8);
AzChar[10].letter := Chr($00C9);
AzChar[11].letter := Chr($00CA);
AzChar[12].letter := Chr($00CB);
AzChar[13].letter := Chr($00CC);
AzChar[14].letter := Chr($00CD);
AzChar[15].letter := Chr($00CE);
AzChar[16].letter := Chr($00CF);
AzChar[17].letter := Chr($00D0);
AzChar[18].letter := Chr($00D1);
AzChar[19].letter := Chr($00D2);
AzChar[20].letter := Chr($00D3);
AzChar[21].letter := Chr($00D4);
AzChar[22].letter := Chr($00D5);
AzChar[23].letter := Chr($00D6);
AzChar[24].letter := Chr($00D7);
AzChar[25].letter := Chr($00D8);
AzChar[26].letter := Chr($00D9);
AzChar[27].letter := Chr($00DA);
AzChar[28].letter := Chr($00DB);
AzChar[29].letter := Chr($00DC);
AzChar[30].letter := Chr($00DD);
AzChar[31].letter := Chr($00DE);
AzChar[32].letter := Chr($00DF);
//Инициализация//
while NOT EOF(AzFile) do
begin
Read(AzFile,c);
if c = AzChar[1].letter then Inc(AzChar[1].count);
if c = AzChar[2].letter then Inc(AzChar[2].count);
if c = AzChar[3].letter then Inc(AzChar[3].count);
if c = AzChar[4].letter then Inc(AzChar[4].count);
if c = AzChar[5].letter then Inc(AzChar[5].count);
if c = AzChar[6].letter then Inc(AzChar[6].count);
if c = AzChar[7].letter then Inc(AzChar[7].count);
if c = AzChar[8].letter then Inc(AzChar[8].count);
if c = AzChar[9].letter then Inc(AzChar[9].count);
if c = AzChar[10].letter then Inc(AzChar[10].count);
if c = AzChar[11].letter then Inc(AzChar[11].count);
if c = AzChar[12].letter then Inc(AzChar[12].count);
if c = AzChar[13].letter then Inc(AzChar[13].count);
if c = AzChar[14].letter then Inc(AzChar[14].count);
if c = AzChar[15].letter then Inc(AzChar[15].count);
if c = AzChar[16].letter then Inc(AzChar[16].count);
if c = AzChar[17].letter then Inc(AzChar[17].count);
if c = AzChar[18].letter then Inc(AzChar[18].count);
if c = AzChar[19].letter then Inc(AzChar[19].count);
if c = AzChar[20].letter then Inc(AzChar[20].count);
if c = AzChar[21].letter then Inc(AzChar[21].count);
if c = AzChar[22].letter then Inc(AzChar[22].count);
if c = AzChar[23].letter then Inc(AzChar[23].count);
if c = AzChar[24].letter then Inc(AzChar[24].count);
if c = AzChar[25].letter then Inc(AzChar[25].count);
if c = AzChar[26].letter then Inc(AzChar[26].count);
if c = AzChar[27].letter then Inc(AzChar[27].count);
if c = AzChar[28].letter then Inc(AzChar[28].count);
if c = AzChar[29].letter then Inc(AzChar[29].count);
if c = AzChar[30].letter then Inc(AzChar[30].count);
if c = AzChar[31].letter then Inc(AzChar[31].count);
if c = AzChar[32].letter then Inc(AzChar[32].count);
end;//while
for i := 1 to nOfChars do
memResult.Lines.Add(AzChar[i].letter + " <---> " + IntToStr(AzChar[i].count));
end;
end.
PS.Не использовалcase
,потому что в нем не допускаетсяWideChar
.
Юникодные коды букв брал из Таблицы символов,выбрав там соответствующий шрифт.
← →
Искандер В. (2006-07-05 18:39) [14]И кстати,как программно узнать,в каком шрифте на данный момент текст в текстовом файле,который я открыл?
← →
guav © (2006-07-05 20:49) [15]Видимо в 2000 установленна другая кодовая страница чем в ХР, поэтому в строке
>memResult.Lines.Add(AzChar[i].letter + " <---> " + IntToStr(AzChar[i].count));
перекодировка в ANSI из Unicode срабатывает неправильно.
Можно перекодировать вручную через WideCharToMultiByte, задав соответствующую кодировку. Для одного символа это будет выглядеть так:function WCharToChar(const W: WideChar): AnsiChar;
begin
if WideCharToMultiByte(1251, 0, @W, 1, @Result, 1, nil, nil) <> 1 then
RaiseLastOsError;
end;...
memResult.Lines.Add(WCharToChar(AzChar[i].letter) + " <---> " + IntToStr(AzChar[i].count));
Вместо 1251 подставить номер требуемой кодовой страницы. Его можно узнать, выполнив GetACP там, где код [13] работает правильно.
> И кстати,как программно узнать,в каком шрифте на данный
> момент текст в текстовом файле,который я открыл?
Текстовый файл не содержит никакой информации о шрифте.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.041 c