Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кодировка текста (про TEncoding читал и пробовал) / 25 сообщений из 35, страница 1 из 2
12.01.2016, 15:31
    #39145573
smallserg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
Долго рылся на форуме, но не нашел :(. Есть текстовый файл в кодировке 866.
Читаю оттуда строку кракозябр и нужно перевести её в WIN1251. Но у
TEncoding я не нашел нужную мне кодировку. Кто знает - помогите,
пожалуйста. Пытался так :

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm1.STF(s:string);
var
msg:TStringList;
begin
msg:=TStringList.Create;
msg.Add(s);
msg.SaveToFile('dsgsd.txt', TEncoding.UTF8 ) ;
end;
...
Рейтинг: 0 / 0
12.01.2016, 15:38
    #39145581
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
Яву знаешь? Если да, то проще некуда: 17506892
...
Рейтинг: 0 / 0
12.01.2016, 15:39
    #39145582
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
С чего взяли, что UTF8 = 866? Что там цифра 8 в обоих есть? )
...
Рейтинг: 0 / 0
12.01.2016, 15:40
    #39145584
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
smallsergЧитаю оттуда строку

Начнём с того, что приведённый код записывает строку.
...
Рейтинг: 0 / 0
12.01.2016, 15:43
    #39145588
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
GunSmokersmallsergЧитаю оттуда строку

Начнём с того, что приведённый код записывает строку.
И добей его тем, что
smallsergДолго рылся на форуме, но не нашел
Не соответствует действительности.
...
Рейтинг: 0 / 0
12.01.2016, 15:48
    #39145592
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
  Encoding866: TMBCSEncoding;
begin
  Encoding866 := TMBCSEncoding.Create(866);
  try
    // работаем с Encoding866
  finally
    FreeAndNil(Encoding866);
  end;
end;



Ну и как бы, если кодировка совсем фиксирована, то TEncoding не нужен. TEncoding применяется, когда кодировка не известна на этапе компиляции.

А так-то можно:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
type
  String866 = type AnsiString(866);

var
  Str866: String866;
  Str: String;
begin
  Str := 'Привет'; // - UTF-16 (aka Unicode)
  Str866 := Str; // - волшебство
  // Str866 - OEM 866 (aka Cyrillic MS-DOS)
end;
...
Рейтинг: 0 / 0
12.01.2016, 17:02
    #39145684
smallserg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
GunSmoker,

Проверил последний пример - волшебства не увидел. Как были символы 'Привет',
так эти символы и записались в файл. Я же пытаюсь добиться отображения
кракозябр русскими буквами.
...
Рейтинг: 0 / 0
12.01.2016, 17:08
    #39145689
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
smallserg,

Попробуй так:

Код: pascal
1.
StringList.LoadFromFile(FileName,TEncoding.GetEncoding(866));
...
Рейтинг: 0 / 0
12.01.2016, 17:11
    #39145693
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
smallsergПроверил последний пример - волшебства не увидел. Как были символы 'Привет',
так эти символы и записались в файл. Я же пытаюсь добиться отображения
кракозябр русскими буквами.Правильно поставленный вопрос содержит половину ответа. Вот и учись ставить. Пока у тебя не стыкуется код с вопросами, а телепатов, чтобы понять, что тебе на самом деле нужно, здесь очень мало
...
Рейтинг: 0 / 0
12.01.2016, 17:15
    #39145698
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
DarkMasterПопробуй так:Это конвертнёт из CP-866 в UTF-16, не уверен что это надо ТС-у :)
...
Рейтинг: 0 / 0
12.01.2016, 17:50
    #39145742
kv67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
function ConvFromDOS(Source: String): String;
var
  i: integer;

begin
  Result := '';
  for i := 1 to Length(Source) do
    begin
      case Ord(Source[i]) of
        240: Source[i] := Chr(168);                                               //  буква Ё (большая)
        241: Source[i] := Chr(184);                                               //  буква ё (маленькая)
        252: Source[i] := Chr(185);                                               //  знак №  (номер)
          else
        if (Ord(Source[i]) > 127) then
          if Ord(Source[i]) < 176 then
            Source[i] := Chr(Ord(Source[i]) + 64)
              else
            Source[i] := Chr(Ord(Source[i]) + 16);
      end;
    end;
  Result := Source;
end;
...
Рейтинг: 0 / 0
12.01.2016, 17:52
    #39145748
kv67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
Точнее, так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
function ConvFromDOS(const Source: String): String;
var
  i: integer;

begin
  Result := '';
  for i := 1 to Length(Source) do
    begin
      case Ord(Source[i]) of
        240: Source[i] := Chr(168);                                               //  буква Ё (большая)
        241: Source[i] := Chr(184);                                               //  буква ё (маленькая)
        252: Source[i] := Chr(185);                                               //  знак №  (номер)
          else
        if (Ord(Source[i]) > 127) then
          if Ord(Source[i]) < 176 then
            Source[i] := Chr(Ord(Source[i]) + 64)
              else
            Source[i] := Chr(Ord(Source[i]) + 16);
      end;
    end;
  Result := Source;
end;
...
Рейтинг: 0 / 0
12.01.2016, 18:01
    #39145764
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
smallsergКак были символы 'Привет', так эти символы и записались в файл.

Несложно сообразить, что проблема - в записи в файл. Для танкистов:

Вариант с TEncoding:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
var
  Enc866: TMBCSEncoding;
  B: TBytes;
  FS: TFileStream;
begin
  Enc866 := TMBCSEncoding.Create(866);
  try
    Caption := 'Encoding: ' + IntToStr(Enc866.CodePage);
    B := Enc866.GetBytes('Привет');
  finally
    FreeAndNil(Enc866);
  end;

  FS := TFileStream.Create('My.txt', fmCreate or fmShareExclusive);
  try
    FS.WriteBuffer(Pointer(B)^, Length(B));
  finally
    FreeAndNil(FS);
  end;
end;



Вариант с AnsiString(CodePage):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
type
  String866 = type AnsiString(866);

var
  Str866: String866;
  Str: String;
  FS: TFileStream;
begin
  Str := 'Привет';
  Caption := 'Str: ' + IntToStr(StringCodePage(Str)); // - UTF-16 (aka Unicode)
  Str866 := Str; // - волшебство
  Caption := Caption + ' Str866: ' + IntToStr(StringCodePage(Str866)); // Str866 - OEM 866 (aka Cyrillic MS-DOS)

  FS := TFileStream.Create('My.txt', fmCreate or fmShareExclusive);
  try
    FS.WriteBuffer(Pointer(Str866)^, Length(Str866) * SizeOf(Str866[1]));
  finally
    FreeAndNil(FS);
  end;
end;
...
Рейтинг: 0 / 0
12.01.2016, 18:04
    #39145766
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
Вариант с TStringList:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
var
  Enc866: TMBCSEncoding;
  Str: TStringList;
begin
  Str := TStringList.Create;
  try
    Str.Add('Привет');

    Enc866 := TMBCSEncoding.Create(866);
    try
      Caption := 'Encoding: ' + IntToStr(Enc866.CodePage);
      Str.SaveToFile('My.txt', Enc866);
    finally
      FreeAndNil(Enc866);
    end;

  finally
    FreeAndNil(Str);
  end;
end;
...
Рейтинг: 0 / 0
12.01.2016, 19:56
    #39145876
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
Кстати...

DarkMasterПопробуй так:
Код: pascal
1.
StringList.LoadFromFile(FileName, TEncoding.GetEncoding(866));



Утечка. TEncoding.GetEncoding создаёт новый объект, который нужно освобождать.
...
Рейтинг: 0 / 0
12.01.2016, 19:58
    #39145878
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
Ну и, соответственно, в моих примерах выше можно по аналогии TMBCSEncoding.Create(866) заменить на TEncoding.GetEncoding(866) (и TMBCSEncoding на TEncoding).
...
Рейтинг: 0 / 0
12.01.2016, 21:17
    #39145911
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
GunSmoker,

Это как бы очевидный пример для отображения. С остальным просто не стал заморачиваться.
...
Рейтинг: 0 / 0
13.01.2016, 09:48
    #39146102
smallserg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
GunSmoker,

Спасибо, конечно, за помощь, но перед тем как выложить пост вы пробуете
компилировать ваши варианты? Вариант с TStringList дает ошибку "Undeckared identitfier: CodePage"
...
Рейтинг: 0 / 0
13.01.2016, 10:10
    #39146123
smallserg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
GunSmokerВариант с TStringList:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
var
  Enc866: TMBCSEncoding;
  Str: TStringList;
begin
  Str := TStringList.Create;
  try
    Str.Add('Привет');

    Enc866 := TMBCSEncoding.Create(866);
    try
      Caption := 'Encoding: ' + IntToStr(Enc866.CodePage);
      Str.SaveToFile('My.txt', Enc866);
    finally
      FreeAndNil(Enc866);
    end;

  finally
    FreeAndNil(Str);
  end;
end;



Этот вариант действительно записывает Привет в кодировке 866. Но почему тогда не
проходит обратная перекодировка? Пробую вот так :
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 function TForm1.ConvFromDOS(s: String): String;
var
  Enc866: TMBCSEncoding;
  Str: TStringList;
begin
  Str := TStringList.Create;
  try
    Str.Add('ЏаЁўҐв');

    Enc866 := TMBCSEncoding.Create(1251);
    try

      Str.SaveToFile('My.txt', Enc866);
    finally
      FreeAndNil(Enc866);
    end;

  finally
    FreeAndNil(Str);
  end;
end;
...
Рейтинг: 0 / 0
13.01.2016, 10:52
    #39146159
smallserg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
Так тоже не получается

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
type
     String1251 = type AnsiString(1251);

 function TForm1.ConvFromDOS2(s: String): String;
var
  Str866: String1251;
  Str: String;
  FS: TFileStream;
begin
  Str := 'ЏаЁўҐв';
  Caption := 'Str: ' + IntToStr(StringCodePage(Str)); // - UTF-16 (aka Unicode)
  Str866 := Str; // - волшебство
  Caption := Caption + ' Str866: ' + IntToStr(StringCodePage(Str866)); // Str866 - OEM 866 (aka Cyrillic MS-DOS)

  FS := TFileStream.Create('My2.txt', fmCreate or fmShareExclusive);
  try
    FS.WriteBuffer(Pointer(Str866)^, Length(Str866) * SizeOf(Str866[1]));
  finally
    FreeAndNil(FS);
  end;
end;



естественно, type объявлен в public
...
Рейтинг: 0 / 0
13.01.2016, 11:15
    #39146178
smallserg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
kv67Точнее, так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
function ConvFromDOS(const Source: String): String;
var
  i: integer;

begin
  Result := '';
  Source :='ЏаЁўҐв';
  for i := 1 to Length(Source) do
    begin
      case Ord(Source[i]) of
        240: Source[i] := Chr(168);                                               //  буква Ё (большая)
        241: Source[i] := Chr(184);                                               //  буква ё (маленькая)
        252: Source[i] := Chr(185);                                               //  знак №  (номер)
          else
        if (Ord(Source[i]) > 127) then
          if Ord(Source[i]) < 176 then
            Source[i] := Chr(Ord(Source[i]) + 64)
              else
            Source[i] := Chr(Ord(Source[i]) + 16);
      end;
    end;
  Result := Source;
end;



ЏаЁўҐв - это слово Привет в кодировке 866.

В результате ваша функция получила из него 'ПрБѮҠт'
...
Рейтинг: 0 / 0
13.01.2016, 12:14
    #39146284
jmp_original
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
smallsergЏаЁўҐв - это слово Привет в кодировке 866.
Если я всё правильно вижу™, то - нет. В вашем случае это ЏаЁўҐв в кодировке unicode.
...
Рейтинг: 0 / 0
13.01.2016, 12:27
    #39146303
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
авторНо почему тогда не проходит обратная перекодировка?

Поточу что нет знания о том, что такое строки и кодировки.

Строка - это текст. Например, 'привет'. Она имеет представление в байтах, которое определяет кодировка. И эти два представления смешивать не нужно. В строках нужно хранить текст и не пытаться вставлять в них "байтовое представление строки 'привет' в кодировке MS DOS".
...
Рейтинг: 0 / 0
13.01.2016, 12:30
    #39146311
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
...
Рейтинг: 0 / 0
13.01.2016, 17:06
    #39146653
kv67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка текста (про TEncoding читал и пробовал)
smallserg,

Прошу прощения, у меня работает вот так (немного поправил функцию):

Код: pascal
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.
function ConvFromDOS(Source: String): String;
var
  i: integer;

begin
  Result := '';
  for i := 1 to Length(Source) do
    begin
      case Ord(Source[i]) of
        240: Source[i] := Chr(168);                                               
        241: Source[i] := Chr(184);                                              
        252: Source[i] := Chr(185);                                               
          else
        if (Ord(Source[i]) > 127) then
          if Ord(Source[i]) < 176 then
            Source[i] := Chr(Ord(Source[i]) + 64)
              else
            Source[i] := Chr(Ord(Source[i]) + 16);
      end;
    end;
  Result := Source;
end;

procedure TfmTest.Button1Click(Sender: TObject);
begin
  ShowMessage(ConvFromDOS('ЏаЁўҐв'));
end;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кодировка текста (про TEncoding читал и пробовал) / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]