Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/135: Рейтинг темы: голосов - 135, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 21.09.2010
Сообщений: 4

Как изменить кодировку?

21.09.2010, 11:38. Показов 27702. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
как сделать, чтобы дельфи открывал файл, менял кодировку на свою, выполнял код и потом менял обратно?
сам код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;
 
type
 
  TPerson = record
    Surname: string[24];
    данные1: string[14];
    данные2: string[10];
    данные3: string[21];
    size: string[13];
    skotor: string[10];
    pokotor: String[10];
    zakotor: string[10];
    primech: string[10];
 
  end;
 
  TArrPerson = array [0..0] of TPerson;
  PPersons = ^TArrPerson;
 
 
 
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    StatusBar1: TStatusBar;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function ReplaceChar(Value: string; cfrom,cto:char): string;
var tmp:string;
 
begin
  tmp:=Value;
  while pos(cfrom,tmp)>0 do
    tmp[pos(cfrom,tmp)]:=cto;
  result:=tmp;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog.Execute then
  Edit1.Text:=OpenDialog.FileName;
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog.Execute then
  Edit2.Text:=OpenDialog.FileName;
 
  end;
 
 
procedure TForm1.Button3Click(Sender: TObject);
begin
if SaveDialog.Execute then
  Edit3.Text:=SaveDialog.FileName;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
var
  Persons: PPersons;
 
  i, j, count, MyF : integer;
    search:boolean;
    f,fout: textfile;
 
  tmp: string;
  tmp2: Pansichar;
 
 
 
 //Persons: Fpersons;
  tmp1: string[14];
  Formats, fs: TFormatSettings;
begin
  Formats.LongDateFormat:='DD/MM/YYYY';
  Formats.ShortDateFormat:='DD/MM/YYYY';
  tmp2:='�¥â ¤***ëå';
//  AnsiToOem(tmp2,tmp2);
//  CharToOem(tmp2,tmp2);
  count:=0;
  AssignFile(f,Edit1.Text);
  ReSet(f);
  Readln(f,tmp);
  Readln(f,tmp);
  Readln(f,tmp);
  Readln(f,tmp);
  Readln(f,tmp);
  Readln(f,tmp);
  Readln(f,tmp);
  Readln(f,tmp);
  Readln(f,tmp);
//  Readln(f,tmp);
//  Readln(f,tmp);
 
  while copy(tmp,3,5) <>'-----' do
    begin
      ReAllocMem(Persons, SizeOf(TPerson)*(count+1));
      //ShowMessage(tmp);
      Persons^[count].SNILS:=trim(copy(tmp,10,14));
     // ShowMessage(tmp);
      Persons^[count].Surname:=trim(copy(tmp,25,23));
      Persons^[count].данные1:=trim(copy(tmp,50,10));
      Persons^[count].данные2:=trim(copy(tmp,61,22));
      Persons^[count].данные3:=trim(copy(tmp,84,13));
      if length(trim(copy(tmp,98,10)))>0 then
      Persons^[count].skotor:=trim(copy(tmp,98,10))
      else Persons^[count].skotor:=' ';
      if length(trim(copy(tmp,109,10)))>0 then
      Persons^[count].pokotor:=trim(copy(tmp,109,10))
      else Persons^[count].pokotor:=' ';
      if length(trim(copy(tmp,120,10)))>0 then
      Persons^[count].zakotor:=trim(copy(tmp,120,10))
      else Persons^[count].zakotor:=' ';
      Persons^[count].primech:=trim(copy(tmp,131,10));
      inc(count);
      Readln(f,tmp);
 
    end;
//  ShowMessage(IntToStr(count));
  ReAllocMem(Persons, SizeOf(TPerson)*(count+0));
  CloseFile(f);
  AssignFile(f,Edit2.Text);
//  tmp1:=tmp;
//  While length(tmp1)<30 do
  ReSet(f);
  AssignFile(fout,Edit3.Text);
  ReWrite(fout);
  readln(f,tmp);
  writeln(fout,tmp);
  i:=0;
  while not eof(f) do
    begin
      Search:=False;
      MyF:=0;
        for j:=1 to 7 do
          begin
            Readln(F,tmp);
            Writeln(Fout,tmp);
          end;
      readln(f,tmp);
      tmp1:=copy(tmp,10,14);
      //ShowMessage(tmp1);
      writeln(fout,tmp);
      for j:=1 to 12 do
        begin
          readln(f,tmp);
          writeln(fout,tmp);
        end;
        //Writeln(fout,tmp);
        for j:=0 to count-1 do
          begin
            if pos(Persons^[j].SNILS,tmp1)>0 then
              begin
                Search:=true;
                MyF:=j;
              end;
          end;
      if not Search then
        writeln(fout,tmp2)
      else
        begin
          tmp:=Persons^[MyF].данные1+' '+Persons^[MyF].Surname+' '+Persons^[MyF].данные2+Persons^[MyF].данные3+' '+Persons^[MyF].size+' '+Persons^[MyF].skotor+' '+Persons^[MyF].pokotor+' '+Persons^[MyF].zakotor+' '+Persons^[MyF].primech;
          writeln(fout,tmp);
        end;
          readln(f,tmp);
          readln(f,tmp);
          writeln(fout,tmp);
      inc(i);
      StatusBar1.Panels[0].Text:='Îáðàáîòàíî: '+inttostr(i);
      Application.ProcessMessages;
    end;
    ShowMessage('Ãîòîâî');
  end;
end.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.09.2010, 11:38
Ответы с готовыми решениями:

Как изменить кодировку c 866 в 1251
Здравствуйте! Использую Delphi 6. Есть вот такой обработчик клика. procedure Form1.Button2Click(Sender: TObject); begin ...

Как изменить кодировку при парсинге http.get?
когда я парсю регуляркой через исходный код страницы http.get ,то текст отображается так:...

Изменить кодировку строки
Всем здравствуйте! Помогите решить проблему с кодировкой. Имеется бинарный файл со строкой. При чтении и добавлении этой строки в ListBox,...

7
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
21.09.2010, 13:37
Для преобразований строк между кодировками OEM (CP866) и ANSI (CP1251) (т. е. DOS и Windows) предлагаю использовать функции:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
uses
  Windows;
 
//Функция берёт строку в ANSI кодировке CP1251 (Windows)
//и возвращает её перевод в OEM кодировку CP866 (DOS) в виде отдельной строки.
function StrAnsiToOem(const aStr : String) : String;
begin
  Result := '';
  if aStr = '' then Exit;
  SetLength(Result, Length(aStr));
  CharToOem(PChar(aStr), PChar(Result));
end;
 
//Функция берёт строку в OEM кодировке CP866 (DOS)
//и возвращает её перевод в ANSI кодировку CP1251 (Windows) в виде отдельной строки.
function StrOemToAnsi(const aStr : String) : String;
begin
  Result := '';
  if aStr = '' then Exit;
  SetLength(Result, Length(aStr));
  OemToChar(PChar(aStr), PChar(Result));
end;
Например, чтение из файла в DOS кодировке и преобразование в Windows кодировку.
Delphi
1
2
3
4
  //Чтение строки из файла в DOS кодировке (CP866).
  Readln(F, StrTmp);
  //Преобразовние в Windows кодировку (CP1251).
  StrTmp := StrOemToAnsi(StrTmp);
Преобразование из Windows кодировки в DOS и запись в файл.
Delphi
1
2
3
4
  //Преобразовние в DOS кодировку (CP866).
  StrTmp := StrAnsiToOem(StrTmp);
  //Запись в файл строки в DOS кодировке.
  Readln(F, StrTmp);
Либо прямо так:
Delphi
1
2
  //Запись в файл строки в DOS кодировке.
  Readln(F, StrAnsiToOem(StrTmp));
0
0 / 0 / 0
Регистрация: 21.09.2010
Сообщений: 4
21.09.2010, 15:49  [ТС]
попробовал.... если только
Delphi
1
2
3
4
5
6
7
function StrAnsiToOem(const aStr : String) : String;
begin
  Result := '';
  if aStr = '' then Exit;
  SetLength(Result, Length(aStr));
  CharToOem(PChar(aStr), PChar(Result));
end;
ввожу, то прога работает, но кодировку не меняет, если обе части пишу, то вообще не компилируется... ругается на кнопку, ему не нравится в
procedure TForm1.Button1Click(Sender: TObject);
скобка (Sender: TObject);
есть еще предложения? могу выложить два файла, для тренировки если нужно конечно
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
24.09.2010, 09:51
TheBlack, выложи файлы - посмотрим.
0
0 / 0 / 0
Регистрация: 21.09.2010
Сообщений: 4
24.09.2010, 10:23  [ТС]
в первом поле rasp12, во втором meri12... все в архиве, там еще скрин, как будет выглядить окно там выложено по 1 записи, на самом деле они будут исчислятся сотнями если прога выдаст ошибку, попробуйте сделать в файле много таких записей
Вложения
Тип файла: zip 123.zip (8.0 Кб, 84 просмотров)
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
24.09.2010, 11:28
У меня нормально работают такие функции
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
function StrOemToAnsi(const S: AnsiString): AnsiString;
begin
  SetLength(Result, Length(S));
  OemToAnsiBuff(@S[1], @Result[1], Length(S));
end;
 
//---------------------------------------------------------------
function StrAnsiToOem(const S: AnsiString): AnsiString;
begin
  SetLength(Result, Length(S));
  AnsiToOemBuff(@S[1], @Result[1], Length(S));
end;
Взято из библиотеки JEDI (JclStrings.pas)
0
0 / 0 / 0
Регистрация: 21.09.2010
Сообщений: 4
24.09.2010, 12:25  [ТС]
ок, в таком случае, расскажите пожалуйста идиоту, куда вставлять этот код в программе?
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
26.09.2010, 23:04
Предлагаю демонстрационный код, с реализацией двух полезных функций - автоматическое определение кодировок в строках и файлах. Распознаёт OEM и ANSI кодировку.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
//Функция берёт строку в OEM кодировке (DOS)
//и возвращает её перевод в ANSI кодировке (Windows) в виде отдельной строки.
function StrOemToAnsi(const aStr : String) : String;
var
  Len : Integer;
begin
  Result := '';
  Len := Length(aStr);
  if Len = 0 then Exit;
  SetLength(Result, Len);
  OemToAnsiBuff(PAnsiChar(aStr), PAnsiChar(Result), Len);
end;
 
//Функция берёт строку в ANSI кодировке (Windows)
//и возвращает её перевод в OEM кодировке (DOS) в виде отдельной строки.
function StrAnsiToOem(const aStr : String) : String;
var
  Len : Integer;
begin
  Result := '';
  Len := Length(aStr);
  if Len = 0 then Exit;
  SetLength(Result, Len);
  AnsiToOemBuff(PAnsiChar(aStr), PAnsiChar(Result), Len);
end;
 
//Определяет вид кодировки текста в заданной строке.
//0 - не определено, 1 - ANSI (Windows), 2 - OEM (DOS).
function DetectStrCp(const aStr : String) : Integer;
const
  MaxTestSize = 1000;
var
  i, TestSize, AnsiCnt, OemCnt : Integer;
begin
  TestSize := Length(aStr);
  if TestSize > MaxTestSize then
    TestSize := MaxTestSize
  ;
  AnsiCnt := 0;
  OemCnt := 0;
  for i := 1 to TestSize do begin
    if
      ( ( aStr[i] >= #$C0 ) and ( aStr[i] <= #$FF ) )
      or ( aStr[i] in [#$A8, #$B8] )
    then
      Inc(AnsiCnt)
    ;
    if
      ( ( aStr[i] >= #$80 ) and ( aStr[i] <= #$AF ) )
      or
      ( ( aStr[i] >= #$E0 ) and (aStr[i] <= #$F1 ) )
    then
      Inc(OemCnt)
    ;
  end;
 
  if OemCnt = AnsiCnt then
    Result := 0
  else if OemCnt < AnsiCnt then
    Result := 1
  else
    Result := 2
  ;
end;
 
//Определяет вид кодировки текста в заданном файле.
//0 - не определено, 1 - ANSI (Windows), 2 - OEM (DOS).
function DetectFileCp(const aFileName : String) : Integer;
const
  MaxBuffSize = 1000;
var
  F : File;
  StrBuff : String;
  BuffSize : Integer;
begin
  AssignFile(F, aFileName);
  Reset(F, 1);
  BuffSize := FileSize(F);
  if BuffSize > MaxBuffSize then
    BuffSize := MaxBuffSize
  ;
  SetLength(StrBuff, BuffSize);
  BlockRead(F, Pointer(StrBuff)^, BuffSize);
  CloseFile(F);
 
  Result := DetectStrCp(StrBuff);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  Fn1 = 'file1.txt';
  Fn2 = 'file2.txt';
  Fn3 = 'file3.txt';
var
  F1, F2, F3 : File;
  Str1, Str2, Str3 : String;
  Len : Integer;
begin
  //Читем содержимое первого файла.
  AssignFile(F1, Fn1);
  Reset(F1, 1);
  Len := FileSize(F1);
  SetLength(Str1, Len);
  if Len > 0 then
    BlockRead(F1, Pointer(Str1)^, Len)
  ;
  CloseFile(F1);
 
  //Определяем кодировку в первом файле и, если требуется,
  //выполняем перекодировку в ANSI.
  if DetectStrCp(Str1) = 1 then
    Str1 := StrOemToAnsi(Str1)
  ;
 
  //Читем содержимое второго файла.
  AssignFile(F2, Fn2);
  Reset(F2, 1);
  Len := FileSize(F2);
  SetLength(Str2, Len);
  if Len > 0 then
    BlockRead(F2, Pointer(Str2)^, Len)
  ;
  CloseFile(F2);
 
  //Определяем кодировку во втором файле и, если требуется,
  //выполняем перекодировку в ANSI.
  if DetectStrCp(Str2) = 1 then
    Str2 := StrOemToAnsi(Str2)
  ;
 
  //Склеиваем содержимое двух файлов и записываем в третий файл.
  //Текст в третьем файле будет в кодировке ANSI.
  Str3 := Str1 + Str2;
  AssignFile(F3, Fn3);
  Rewrite(F3, 1);
  BlockWrite(F3, Pointer(Str3)^, Length(Str3));
  CloseFile(F3);
end;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.09.2010, 23:04
Помогаю со студенческими работами здесь

Как изменить кодировку
Здравствуйте! Подключаюсь к БД, делаю запрос, вывожу запрос при помощи echo. Но выходят кракозябры. Понял, что это из-за кодировки....

Как изменить кодировку
Вобщем На локалке стоял нормално небыло не каких злобных ?????????? Перенес на хостенг стали все буквы ???? как изменить кодировку скорей...

Как изменить кодировку
Работаю с icq библиотекой WebIcqPro.class.php. Сообщения с него приходят в кодировке BigEndianUnicode или UnicodeBE. Входящие сообщения...

Как изменить кодировку БД?
Всем привет! При сохранении русского текста в БД, вместо слов вопросы(?), а английские все в порядке. Мне сказали надо изменить кодировку...

Как в excel изменить кодировку
У меня есть прайс лист, он в самом экселе нормально отображается, а вот при импорте на сайт получаю каракули


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru