Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кириллица в бинарном файле, читаема кириллица в бинарном файле 
:(
    Опции темы
RedKot
Дата 18.12.2017, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2007

Репутация: нет
Всего: нет



Всем заинтересованным - здравствуйте!
Есть ну очень простой код для записи данных в типизированный бинарный файл:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Button1: TButton;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TMember = record
    Name : String[30];
    eMail : String[50];
    Posts : LongInt;
  end;

var
  Form1: TForm1;
  Members : array[1..3] of TMember;
  F : file of TMember;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  Members[1].Name:='Алексей';
  Members[1].eMail:='крутойEMAIL';
  Members[1].Posts:=1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  Members[2].Name:=edit1.Text;
  Members[2].eMail:=edit2.Text;
  Members[2].Posts:=strtoint(edit3.Text);
  Members[3].Name:=edit4.Text;
  Members[3].eMail:=edit5.Text;
  Members[3].Posts:=strtoint(edit6.Text);

  AssignFile(F, 'Members.txt');
  Rewrite(F);
  try
    for i:= 1 to 3 do
    Write (F, Members[i]);
  finally
    CloseFile(F);
  end;
end;

end.


Проблема в том, что в созданном файле, кириллица (русские буквы) читаемы от А до Я, то есть весь текст абсолютно читаем в блокноте (в моем случае AkelPad x32 4.8.8.0). Однако и в интернете люди выкладывают свои примеры, где кириллица отображается каракулями (за исключением латиницы) и если открыть хотя бы тот же Word-файл (doc), там тоже каракули. Почему у меня все читаемо, не понимаю?! Чувствую что все просто, но  smile  Использую: delphi 7, delphi 2009, винда XP sp3
Прошу в поиск не отправлять - был там, над знаниями не глумиться - у каждого свое, над каждым можно поглумиться, форум двухсловными отписками не загружать. Огромное спасибо за будущую помощь и понимание!
PM MAIL   Вверх
Snowy
Дата 19.12.2017, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Delphi 7 использует 8-битную кодировку, которая зависит от настройки системы пользователя "Язык для неюникодных программ"
Как бороться, можно почитать здесь

В Delphi 2009 такой проблемы быть не должно.
PM MAIL   Вверх
RedKot
Дата 19.12.2017, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2007

Репутация: нет
Всего: нет



Попробовал еще раз в delphi 7 компилировать приведенный выше мною код - в результате русские буквы (слова) полностью читаются, попробовал то же самое с вставками из 
Цитата

Как бороться, можно почитать здесь
, то же самое.
Попробовал в delphi 2009 компилировать приведенный выше мною код - русские буквы полностью читаются, с вставками из 
Цитата

Как бороться, можно почитать здесь
 - то же самое.
Залез еще раз в doc (вордовский) файл через блокнот (AkelPad) - ворд сохраняет свои данные в кодировке UTF-16LE, а делфи 7 и 2009 сохраняет в кодировке windows-1251, ладно бы делфи 7, но почему делфи 2009, там же стринг unicode'рован на сколько я понимаю.
Так вот, люди то в интернете говорят о том, что у них отображение русских слов в бинарном файле при использовании делфи 7 иероглифами (то есть, я так понимаю сохранение осуществляется в юникоде), а у меня русскими (я так понимаю - ansi). Может так и должно быть, что русский текст в бинарном файле свободно читаем? Запутался.

Snowy, если не затруднит, можно тебя попросить компильнуть код в делфи 7, и посмотреть что получится?

Добавлено через 13 минут и 38 секунд
кстати, попробовал записать в бинарный файл турецкие слова с их спец символами через делфи 2009, вот что получилось:
- в проге вставляю: 'türkçe çeviri'
- в бинарном файле получаю: 'turkce ceviri'
PM MAIL   Вверх
RedKot
Дата 19.12.2017, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2007

Репутация: нет
Всего: нет



причем слово 'ceviri' перенесено на следующую строку
PM MAIL   Вверх
Snowy
Дата 25.12.2017, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Могу только предложить использовать Delphi 2009+ и не использовать типизированный файл. 
Скорее всего строки фиксированной длины неюникодные.
Используй обычные строки.
Вот накидал пример:

Код

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  end;

  TMember = class
    public Name : String;
    public eMail : String;
    public Posts : LongInt;
    constructor Create(Name: String; eMail: String; Posts: Longint); overload;
    constructor Create(Name: String; eMail: String; Posts: String); overload;
  end;

var
  Form1: TForm1;
  Members : TList;

implementation

{$R *.dfm}

constructor TMember.Create(Name: String; eMail: String; Posts: Longint);
begin
  self.Name := Name;
  self.eMail := eMail;
  self.Posts := Posts;
end;

constructor TMember.Create(Name: String; eMail: String; Posts: String);
var
  p: LongInt;
begin
  TryStrToInt(Posts, p);
  Create(Name, eMail, p);
end;

const
  MyFileName: String = 'Members.txt';

procedure Save();
var
  m: TMember;
  sl: TStringList;
  i: Integer;
begin
  sl := TStringList.Create;
  for i := 0 to Members.Count-1 do
  begin
    m := Members[i];
    sl.Add(m.Name + #9 + m.eMail + #9 + IntToStr(m.Posts));
  end;
  sl.SaveToFile(MyFileName);
end;

function Load(): boolean;
var
  m: TMember;
  sl: TStringList;
  l: TStringList;
  i: Integer;
begin
  if FileExists(MyFileName) then
  begin
    sl := TStringList.Create;
    sl.LoadFromFile(MyFileName);
    l := TStringList.Create;
    l.Delimiter := #9;
    for i := 0 to sl.Count-1 do
    begin
      l.DelimitedText := sl[i];
      m := TMember.Create(l[0], l[1], l[2]);
      Members.Add(m);
    end;
    result := true;
  end
  else result := false;
end;



procedure TForm1.FormShow(Sender: TObject);
var
  m: TMember;
begin
  Members := TList.Create;
  if not Load() then
  begin
    m := TMember.Create('Алексей', 'крутойEMAIL', 1);
    Members.Add(m);
  end;
  m := Members.Last;
  Edit1.Text := m.Name;
  Edit2.Text := m.eMail;
  Edit3.Text := IntToStr(m.Posts);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  m: TMember;
begin
  m := TMember.Create(edit1.Text, edit2.Text, edit3.Text);
  Members.Add(m);
  m := TMember.Create(edit4.Text, edit5.Text, edit6.Text);
  Members.Add(m);
  Save();
end;

PM MAIL   Вверх
Gwire
Дата 1.2.2018, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4



RedKot, можешь попробовать кодировать/декодировать в UTF8.

Код

type
  TMember = record
    Name  : String[60]; 
    eMail : String[100];
    Posts : LongInt;
  end;

var
  Form1: TForm1;
  Members: array[1..3] of TMember;
  ReadTest: TMember;
  F : file of TMember;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  AllocConsole;              // отркоем консоль для вывода
  SetConsoleOutputCP(1251);  //   текста при проверке результатов

  FillChar( Members, Sizeof(Members), 0 );
  Members[1].Name  := UTF8Encode('Алексей');
  Members[1].eMail := UTF8Encode('крутойEMAIL');
  Members[1].Posts := 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
  Members[2].Name  := UTF8Encode('Педро');
  Members[2].eMail := UTF8Encode('феноменальный@EMAIL');
  Members[2].Posts := 100500;
  Members[3].Name  := UTF8Encode('Воланд');
  Members[3].eMail := UTF8Encode('лаконичный@EMAIL');
  Members[3].Posts := 0;

  AssignFile(F, 'Members.txt');
  Rewrite(F);
  try
    for i:= 1 to 3 do Write (F, Members[i]);
  finally
    CloseFile(F);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
    FillChar( ReadTest, Sizeof(ReadTest), 0 );
    
    AssignFile(F, 'Members.txt');
    try
        Reset(F);

        for i:= 1 to 3 do
        begin
            Read( F, ReadTest );
            Writeln(i, #9,
               UTF8Decode(ReadTest.Name):16, #9,
               UTF8Decode(ReadTest.eMail):24 );
        end;
    finally
        CloseFile(F);
    end;
end;

Чуть не забыл. От чтения глазиками в AkelPad этот файл защищен только отсутствием BOM слова. Если, например, NotePad++ сказать, что кодировка этого файла "UTF-8 (без BOM)", то он снова становится читаем глазиками. Вот такие дела.

Это сообщение отредактировал(а) Gwire - 1.2.2018, 18:33
PM MAIL   Вверх
Gwire
Дата 1.2.2018, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4



Если нужно маломайски зашифровать данные, то лучше вместо UTF8Encode и UTF8Decode написать свои Encode и Decode.
А в них реализовать какой нибудь метод шифрования. Самый простой вместо символов записывать их Hex-кода.

Код

Encode ---> IntToHex( Byte( <char> ), 2 )
Decode ---> Char( StrToInt( '$'+<2_hex_символа> ) )

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.