Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2018, 22:58   #1
dwa_e
 
Регистрация: 06.01.2008
Сообщений: 8
По умолчанию Кодировка в Delphi 10.2

Помогите разобраться с кодировкой, с сайта embarcadero взял пример
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  LBuffer: TBytes;
  LByteOrderMark: TBytes;
  LOffset: Integer;
  LEncoding, DestEncoding: TEncoding;
  LFileStream: TFileStream;
  EncodingArray: array[0..5] of TEncoding;
begin
  LEncoding:= nil;
  EncodingArray[0]:= TEncoding.UTF8;
  EncodingArray[1]:= TEncoding.UTF7;
  EncodingArray[2]:= TEncoding.Unicode;
  EncodingArray[3]:= TEncoding.Default;
  EncodingArray[4]:= TEncoding.BigEndianUnicode;
  EncodingArray[5]:= TEncoding.ASCII;
  DestEncoding := EncodingArray[ComboBox1.ItemIndex];
  LFileStream := TFileStream.Create(Edit1.Text, fmOpenRead);
  try
    // Read file into buffer.
    SetLength(LBuffer, LFileStream.Size);
//    LFileStream.Read(LBuffer[0], Length(LBuffer));
    LFileStream.ReadBuffer(Pointer(LBuffer)^, Length(LBuffer));

    // Identify encoding and convert buffer to UTF8.
    LOffset := TEncoding.GetBufferEncoding(LBuffer, LEncoding);
//    for I := 0 to Length(LBuffer) - 1 do
//      Memo1.Lines.Add((LBuffer[I]));
    LBuffer := LEncoding.Convert(LEncoding, DestEncoding, LBuffer,
      LOffset, Length(LBuffer) - LOffset);
  finally
    LFileStream.Free;
  end;

  LFileStream := TFileStream.Create(Edit2.Text, fmCreate);
  try
    // Write an encoding byte-order mark and buffer to output file.
    LByteOrderMark := DestEncoding.GetPreamble;
    LFileStream.Write(LByteOrderMark[0], Length(LByteOrderMark));
    LFileStream.Write(LBuffer[0], Length(LBuffer));
  finally
    LFileStream.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   with ComboBox1, Items do begin
     Add('TEncoding.UTF8');
     Add('TEncoding.UTF7');
     Add('TEncoding.Unicode');
     Add('TEncoding.Default');
     Add('TEncoding.BigEndianUnicode');
     Add('TEncoding.ASCII');
     ItemIndex := 0;
  end;
end;
загружаю в него файл 256 байт от 00 до FF
Код:
000102030405060708090A0B0C0D0E0F
101112131415161718191A1B1C1D1E1F
202122232425262728292A2B2C2D2E2F
303132333435363738393A3B3C3D3E3F
404142434445464748494A4B4C4D4E4F
505152535455565758595A5B5C5D5E5F
606162636465666768696A6B6C6D6E6F
707172737475767778797A7B7C7D7E7F
808182838485868788898A8B8C8D8E8F
909192939495969798999A9B9C9D9E9F
A0A1A2A3A4A5A6A7A8A9AAABACADAEAF
B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF
C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF
E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF
F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF
выбираю кодировку ASCII и сохраняю в новый файл, и на выходе получаю это
Код:
000102030405060708090A0B0C0D0E0F
101112131415161718191A1B1C1D1E1F
202122232425262728292A2B2C2D2E2F
303132333435363738393A3B3C3D3E3F
404142434445464748494A4B4C4D4E4F
505152535455565758595A5B5C5D5E5F
606162636465666768696A6B6C6D6E6F
707172737475767778797A7B7C7D7E7F
3F3F2C3F222E3F3F3F3F3F3C3F3F3F3F
3F272722222E2D2D3F543F3E3F3F3F3F
203F3F3F243F7C3F3F433F3C3F2D523F
3F3F3F3F3F3F3F2E3F3F3F3E3F3F3F3F
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F
3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F
откуда берётся целое поле 3F ? Файл вроде должен остаться не изменённым.
dwa_e вне форума Ответить с цитированием
Старый 30.12.2018, 06:44   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

3F - это вопросительный знак, он заменяет "нераспознанные" символы
Black Fregat вне форума Ответить с цитированием
Старый 30.12.2018, 12:52   #3
dwa_e
 
Регистрация: 06.01.2008
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
3F - это вопросительный знак, он заменяет "нераспознанные" символы
здесь вы немного не правы вот две строки из моего файла и там не просто 3F вместо символов, а идёт замена символов
вход
Код:
808182838485868788898A8B8C8D8E8F
выход
Код:
3F3F2C3F222E3F3F3F3F3F3C3F3F3F3F
dwa_e вне форума Ответить с цитированием
Старый 31.12.2018, 00:01   #4
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от dwa_e Посмотреть сообщение
выбираю кодировку ASCII и сохраняю в новый файл
А, ничего с версии 2009 string по умолчанию в юникоде и в ASCII набор символов, мягко говоря, ограничен?
Streletz вне форума Ответить с цитированием
Старый 31.12.2018, 00:29   #5
dwa_e
 
Регистрация: 06.01.2008
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
А, ничего с версии 2009 string по умолчанию в юникоде и в ASCII набор символов, мягко говоря, ограничен?
вот я о этой же проблеме, как вернуть нормальную поддержку ASCII?
dwa_e вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi 2010 и кодировка Esoone Общие вопросы Delphi 3 16.11.2012 16:16
Кодировка в delphi Начинающий програм Помощь студентам 5 31.10.2012 04:18
Delphi 2010 и Кодировка cargo29 Общие вопросы Delphi 21 04.08.2011 15:15
Кодировка в MySQL и Delphi Droid БД в Delphi 2 18.06.2009 00:08
Кодировка Клавиатуры в delphi Neymexa Помощь студентам 2 30.12.2008 19:55