0 / 0 / 0
Регистрация: 21.09.2010
Сообщений: 4
1

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2010, 11:38
Ответы с готовыми решениями:

Как изменить кодировку c 866 в 1251
Здравствуйте! Использую Delphi 6. Есть вот такой обработчик клика. procedure...

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

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

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

7
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
21.09.2010, 13:37 2
Для преобразований строк между кодировками 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  [ТС] 3
попробовал.... если только
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
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
24.09.2010, 09:51 4
TheBlack, выложи файлы - посмотрим.
0
0 / 0 / 0
Регистрация: 21.09.2010
Сообщений: 4
24.09.2010, 10:23  [ТС] 5
в первом поле rasp12, во втором meri12... все в архиве, там еще скрин, как будет выглядить окно там выложено по 1 записи, на самом деле они будут исчислятся сотнями если прога выдаст ошибку, попробуйте сделать в файле много таких записей
Вложения
Тип файла: zip 123.zip (8.0 Кб, 84 просмотров)
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
24.09.2010, 11:28 6
У меня нормально работают такие функции
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  [ТС] 7
ок, в таком случае, расскажите пожалуйста идиоту, куда вставлять этот код в программе?
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
26.09.2010, 23:04 8
Предлагаю демонстрационный код, с реализацией двух полезных функций - автоматическое определение кодировок в строках и файлах. Распознаёт 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
26.09.2010, 23:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2010, 23:04
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru