powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
25 сообщений из 60, страница 2 из 3
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39773495
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокУ него грид кракозябры, вероятнее всего, отображаетА как должен? hex-коды? Это бинарный блоб. А если ты туда exe файл засунешь, что он должен отобразить?
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39773545
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док,
Тоже самое у меня если достучаться до бд из IBExpert. Здесь все правильно. (см. скрин)
Проблема при доступе через Delphi :
1) бинарный блоб
==================
Если файл в кодировке utf и сохраняю прямо в бд, то в бинарном блобе текст отображается так что если выводить в мемо, текст нечитабельный.
А если файл в кодировке utf_BOM тогда в бинарном блобе правильно сохраняется(как ansi иероглифы) и следовательно и в мемо нормально отображается.

2) текстовый блоб
==================
не имеет значения кодировка utf или utf-BOM в текстовом блобе в обоих случаях сохраняются китайские иероглифы.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ID:=Query1.FieldByName('Content_id').asInteger;
  OpenDialog1.Execute;
  QueryUpd.Close;
  QueryUpd.SQL.Text := 'SELECT * FROM content where Content_id=:id';
  QueryUpd.Params[0].AsInteger:=ID;
  QueryUpd.open;

  QueryUpd.Edit;
  (QueryUpd.FieldByName('BLOB_BINARY') as TBlobField).LoadFromFile(OpenDialog1.FileName);
  QueryUpd.Post;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ID:=Query1.FieldByName('Content_id').asInteger;
  OpenDialog1.Execute;
  QueryUpd.Close;
  QueryUpd.SQL.Text := 'SELECT * FROM content where Content_id=:id';
  QueryUpd.Params[0].AsInteger:=ID;
  QueryUpd.open;

  QueryUpd.Edit;
  (QueryUpd.FieldByName('BLOB_TEXT') as TBlobField).LoadFromFile(OpenDialog1.FileName);
  QueryUpd.Post;



https://onedrive.live.com/?id=29624722F45C06E9!102428&cid=29624722F45C06E9
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39773614
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если текстовый файл закодирован как "unicode"(noteped) или ucs-2 LE BOM (noteped++) тогда исчезают китаиские иероглифы и файл правильно сохраняется в текстовый блоб. Аналогично, в случае бинарного блоба если файл в utf-BOM.
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39773628
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Это бинарный блоб. А если ты туда exe файл засунешь, что он должен отобразить?
То, что ты туда засунул. Тебя не смущает, что символы первых 127 символов ASCII (совпадающие с юникодом) отображаются корректно?

bastibubuЕсли файл в кодировке utf и сохраняю прямо в бд, то в бинарном блобе текст отображается так что если выводить в мемо, текст нечитабельный.
А ты уверен, что твой мемо корректно читает UTF8 без BOM? ЕМНИП, в дельфях есть функции, которые позволяют "угадать" кодировку текста (в Лазаре они есть)
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39773641
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДокА ты уверен, что твой мемо корректно читает UTF8 без BOM?
Док, спорить с тобой не могу, не исклучаю что так и есть.
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39773644
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя вряд ли. Тот же самый результат когда файл открываю в RichEdit.
Utf8-BOM, Unicode, Unicode Big Endians правильно отображаются.
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39773645
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
то же самое в случае Jedi(jvMemo).
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39773894
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubuХотя вряд ли.
Да неужели? :)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TForm1.FormCreate(Sender: TObject);
begin
  IBDatabase1.Connected:= True;
  IBTransaction1.Active:= True;
  IBQuery1.Active:= True;

  RichMemo1.Text:= TBlobField(IBQuery1.FieldByName('BLOB_BIN')).AsString;
  Memo1.Text:= TBlobField(IBQuery1.FieldByName('BLOB_BIN')).AsString;

  RichMemo2.Lines.LoadFromFile(AppendPathDelim(ExtractFilePath(Application.ExeName)) + 'utf8_without_bom.txt', True);
  Memo2.Text:= TBlobField(IBQuery1.FieldByName('BLOB_TXT')).AsString;
end; 



Не думаю, что в дельфях поведение сильно отличается от Лазаря
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39773958
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док, A как блоб-данные у вас оказались в бд? Через IBExpert? Если да так и у меня все в порядке. Проблема когда компонентами Delphi .
Смотрите. В бюджетном Noteped-е есть кодировки:
utf-8, Unicode, Unicode big endian,
а в Noteped++: utf8, utf8-BOM, ucs2 BE BOM, ucs 2 LE BOM.

Создавал файлы в noteped и когда смотрю encoding в Nooteped++ там видно что для созданного в noteped utf файла noteped++ показывает кодировку utf-BOM. Есть и другие соответствия такого вида:

noteped noteped++utf8 utf8-BOMUnicode ucs-2 LE BOMUnicode big endian ucs-2 BE BOMнет соответствия utf8
Я создавал файл в notepad++ как utf8. А это как раз есть utf8 без BOM. А utf8 без BOM в hex не имеет маркера как ascii и трудно отличить их друг от друга.
Вчера создал 3 файла в noteped: utf8, Unicode, Unicode big endianб сохранял в блобе и в "Firebird Maestro Professional" наблюдал как выглядят в hex(см. скрин).
Где то здесь скрывается причина. Может быть Delphi считает файл без BOM как Ansi и поэтому теряется текст кроме английского.
Сейчас файлы храню как unicode notepad или ucs-2 LE BOM noteped++ и правильно сохраняются в обоих блобах.
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39773966
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док , вы можете создать файл в кодировке utf-8 не в простом noteped-а а в noteped++ и сохранить в блобах. Интересно что скажет Lazarus.
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39773993
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu,

могу, но это будет после 20.00 Мск, когда я домой приду.

Все utf8-ные файлы я создавал в Notepad ++, данные в БД грузил скриптом в IBE. В приведенном выше посте для чтения данных пользовал IBX для лазаруса.

Но, думается, содержимое бинарного блоба не зависит от того, чем в него пишешь. Для чистоты эксперимента надо запускать этот тест на дельфях. Ладно, руки дойдут, попробую.
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39774166
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, все оказалось, как и подозревал. У Лазаря в редакторе кодовая страница под умолчанию UTF8, у дельфей - win1251. Как только применил перекодировку из юникода в анси, все встало на свои места

код
Код: 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.
procedure TForm2.btnReadClick(Sender: TObject);
begin
  if TBlobField(DSet.FN('BLOB_BIN')).IsNull
    then
      begin
        Memo1.Text:= 'Город Гунган пусто-пусто...';
        RichEdit1.Text:= 'Город Гунган пусто-пусто...'
      end
    else
      begin
        Memo1.Text:= Utf8ToAnsi(TBlobField(DSet.FN('BLOB_BIN')).AsString);
        RichEdit1.Text:= Utf8ToAnsi(TBlobField(DSet.FN('BLOB_BIN')).AsString);
      end;

  if TBlobField(DSet.FN('BLOB_TXT')).IsNull
    then
      begin
        Memo2.Text:= 'Город Гунган пусто-пусто...';
        RichEdit2.Text:= 'Город Гунган пусто-пусто...'
      end
    else
      begin
        Memo2.Text:= {Utf8ToAnsi}(TBlobField(DSet.FN('BLOB_TXT')).AsString);
        RichEdit2.Text:= {Utf8ToAnsi}(TBlobField(DSet.FN('BLOB_TXT')).AsString);
      end;
end;

картинка


зы. вставку не пробовал, времени нет. Если будет интересно, проект со скриптами базы прилагаю, можешь чуть доработать напильником (из доп.компонентов EhLib и FIBPlus)
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39774188
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док , большое спасибо вам! Буду еще тестировать. :)
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39774200
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubuБуду еще тестировать. :)
имей ввиду, что при вставке, возможно , надо будет применять обратную перекодировку AnsiToUtf8, чтобы компоненты доступа "правильно" писали данные в базу. Хотя в мануалах к FB пишется, что данные "перекодируются на лету". :)
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39774201
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докнадо будет применять обратную перекодировку AnsiToUtf8
я имел ввиду бинарный блоб, текстовый блоб имеет явное указание на кодировку, потому с ним проблем нет.
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39774648
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док_Vasilisk_Это бинарный блоб. А если ты туда exe файл засунешь, что он должен отобразить?То, что ты туда засунул. Тебя не смущает, что символы первых 127 символов ASCII (совпадающие с юникодом) отображаются корректно?Нет. Мне вообще достаточно надписи (BLOB) и вкладки AsHex.

Что там смотреть? Это бинарные нечитаемые данные. Точка.
bastibubu1) бинарный блоб
==================
Если файл в кодировке utf и сохраняю прямо в бд, то в бинарном блобе текст отображается так что если выводить в мемо, текст нечитабельный.Вот же ж вы настырный. Какое слово из этого

_Vasilisk_Файл бинарный? Используйте BLOB BINARY и Load/SaveStream

Файл текстовый? Используйте BLOB TEXT и AsString.вам не понятно? Или хочецца?
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39774730
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_Файл бинарный? Используйте BLOB BINARY и Load/SaveStream

Файл текстовый? Используйте BLOB TEXT и AsString.
_Vasilisk_ , почему вы думаете что и так не делаю? Но не работает.

Настырность не при чём. По моему, вы не поняли проблему: Если файл сохраняю в кодировке utf8(то есть without BOM) в noteped++ и открываю в мемо текст нечитабельный а если сохраняю в кодировке utf8-BOM, ucs-2 BE BOM, ucs-2 LE BOM) тогда никакие китайские иероглифы не выводит.

Код: pascal
1.
2.
3.
4.
5.
procedure TfMain.bTextfileToMemoClick(Sender: TObject);
begin
OpenDialog1.execute;
memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;



Создайте файл в noteped++ как в кодировке utf8 (без BOM), запишите там 'Hello Привет ' или что-нибудь и открывайте в мемо. Думаю получите тот же результат.
P.S. Простой noteped не подойдет. Там нет utf8 without BOM. Там есть только utf8-BOM.
P.P.S. Unicode (noteped)=ucs-2 BE BOM(Noteped++) работают как часы- правильно загружает текст в обоих блобах, и в мемо, и из мемо в блобах и из блобы в мемо/richedit.
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39774736
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Что там смотреть? Это бинарные нечитаемые данные. Точка.
да расслабься уже, выходные жеж :)
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39775362
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubuСоздайте файл в noteped++ как в кодировке utf8 (без BOM), запишите там 'Hello Привет ' или что-нибудь и открывайте в мемо. Думаю получите тот же результат.
Все правильно. Без BOM как мемо, по-твоему, должен догадаться, что ему скармливают именно utf8?
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39775508
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Все правильно. Без BOM как мемо, по-твоему, должен догадаться, что ему скармливают именно utf8?

Это как раз не трудно. У UTF-8 жесткая структура, так что просто попробовать текст как UTF-8, а если не получится (т.е. если текст не является UTF-8) - пробовать уже другие кодировки.

Вот UTF-16 от MBCS - уже отличать можно только эвристикой-статистикой, но пока примитивной.
А разные MBCS друг от друга - так и вообще....

Забавно, что в целом ему это уже объясняли.

https://stackoverflow.com/questions/54659936/how-to-write-txt-file-in-blob
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39775512
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
for the record
Stack Overflow

I get a Google Drive permissions error when I try to follow your link. Anyway, do you get the same result with text saved to a Char field?


@MartynA, thank you for you answer. I create char(1000) field with utf encoding and then write text from memo in this field. Code is: ms : TMemoryStream; begin ms := TMemoryStream.Create; try memo1.lines.savetostream(ms, TEncoding.UTF8); ms.position := 0; Query1.Edit; Query1.FieldByName('CHAR1').AsString :=memo1.Lines.Text; Query1.Post; As a result: Text with georgian characters is saved succesfully.


"DB has utf-encoding." that is not how Firebird works. Each column of a character type has its own character set, the default character set only specifies the character set to apply when a column is created without a character set clause, and the default character set doesn't apply retroactively. The problem could be that the column has the wrong character set (or none). The problem could also be indicative of using character set NONE as the connection character set instead of explicitly connecting with a connection character set (UTF8 would probably be the best choice given the data)


Note that blobs are even more problematic especially when using text data in binary blobs and then trying to show them as text. I don't do Delphi myself, but I seem to recall Delphi uses UTF-16 by default, which may introduce another chance for conversion errors.


@MarkRotteveel, everywhere and everytime I use only utf encoding. Connection character set also is utf. Text blob field is created with utf. I delete it and recreate but nothing changes. I add Project and db files in my post above.


@MartynA, I edit my onedrive cloud permission. Now you are able download project and db files.

Not knowing Delphi, I can't really help you further, but to me a TFileStream suggests it reads binary, not text. Are you sure that is the proper course of action here?



I do not have Delphi 10.x nor do I have any older AnyDAC/FireDAC library with me, however.... program MyInfoRepository1; uses Vcl.Forms, uMain in 'D:\MyInfoRepository\uMain.pas' {fMain}; - there are two problems with your ZIP: 1) you do not put your main form sources into it, and 2) the very fact that DPR lists absolute file name instead of relative means that your form sources lie outside of your main project file. Sometimes it is intended, but in your case you clearly is dizzy about Delphi programs structure. So, I am ATM skeptical about ur claim Connection character set also is utf.


Perhaps you can put the texts of your forms - both .pas source texrt and .dfm source text - onto some service like Pastebin.com, or github.com


@MarkRotteveel TFileStream is a stream that reads files. How it's interpreted, as raw bytes or as text or whatever else, is an unrelated concern.


@basti also if you can work with TMemoryStream then perhaps you look for TBlobSteam or TField.CreateBlobStream or something of that kind, that your database-connecting library provides.


@Arioch'The, I update my onedrive folder. I simplify project and when I save with new name(save project as...) I forgotten create forms in it. :) As for being skeptical about my claim that Connection character set is utf. I update post and add image. please see.


did you try other firebird connection libraries? dbExpress, Unified Interbase, Interbase Express? Will they work differently w.r.t blob ?


Notepad's UNICODE is WindowsNT Unicode, which used to be UCS-2 in older NT versions and which is UTF16 now ( no a "core" subset USC-2 and UTF16 are the same). So your rightmost screenshot shows almost the same text file data, just with or without BOM


Query1.Params[0].AsStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); - what happens here is TWO operations. 1) you create a binary (not-text) stream out of text file. 2) you push this binary (not-text) stream into blob. When you read files by Default Delphi uses "platform-specific" charset, which for Windows and Delphi2009+ is "WideChar" = UTF16. Then you push the charset-less non-text data into the blob parameter, so no conversion is possible. // try to think along TFile.ReadAllText(const Path: string; const Encoding: TEncoding) and maybe TFile.OpenText


your param type should be text blob, that is ftMemo - check these and compare wit hyour SELECT columns: docwiki.embarcadero.com/Libraries/Seattle/en/… docwiki.embarcadero.com/Libraries/Seattle/en/… docwiki.embarcadero.com/Libraries/Seattle/en/Data.DB.TMemoFi‌​eld also check value and description of TMemoField.Transliterate


So, as of now, I can see two obvious ways to put the text file into the blob field. First one makes double conversion UTF-8 -> UTF-16(UCS2) -> UTF-8. But doing so it implicitly makes data sanity checking on client. Second one would try to just push the data into the database bypassing checks. If you would try to do it with the malformed (non-UTF-8) file - results would differ. Also, Delphi's TEncoding class is weird beast, try to use TEncoding.UTF8 = TUTF8Encoding.Create object to convert non-UTF-8 (malformed) data to string,AFAIR it would return empty string instead of raising Exception


Also, in general I think a special explicit UPDATE OR INSERT SQL statement with using parameters is more safe and debugging-friendly than using implicit SELECT with Query1.Edit, YMMV. Then you can {TMemoField/TParam} . {AsString/AsWideString} := TFile.ReadAllText('myUTF8text.txt', TEncoding.UTF8); for double-conversion and {TMemoField/TParam} . AsBytes := TFile.ReadAllBytes('myUTF8text.txt'); bypassing checks (in particular, if future database versions would change the collation of the blob-text column the direct bypassing insertion maybe would not detect it, not sure).

As of Delphi XE2 though there is a bug in TFile that prevents it reading read-only files (like ones on CD-ROM media, or r/o ACL grants, or r/o file attribute), as even TFile.ReadXXXX methods try to open file for read-write access instead, like default Pascal reset procedure did. I outlined the potential future problems I can see, so check them proactively


@Arioch'The thank you for you attempt to help me. I will carefully read you comments. Today I realise some aspects: When I create txt-file in noteped++ in utf encoding it is utf without BOM. utf in noteped and utf in noteped++ arent the same. utf in noteped is equivalent to utf wirh BOM in noteped++. You may create file in noteped as utf and then open in noteped++ and see encoding in menu.


When I create txt-file in noteped++ not in simple utf encoding but in ucs-2 BE BOM or ucs-2 LE BOM they are saved in blobs correctly(both are 16-bite utfs). Maybe it is because it's difficult for delphi distinguish utf without BOM from Ansi. Both are without markers. You may see image from hex, I put it on onedrive, in my project folder. onedrive.live.com/…


utf encoding - no such thing. There is UTF-7, UTf-8, UTF-16. UTF-32 and maybe more. They are different. Then, UTF-8 (and perhaps UTF-7) are independent on "byte order" (google "big endian" or "intel/Motorola endian") while those >8 UTFs are dependent in proper bytestream aggregation, so they usually use BOM (byte-order marker), to make parser learn byte order of the generator, however it is not required, but a good habit to put it when passing texts across architectures, still a habit not requirement. UTF <= 8 don't need BOM, while it is allowed. BOM is just "invisible letter", one of.


UTF-nn is still UTF-nn with or without BOM. It is just a special letter. Text encoding does not change if you add or remove some letter. UCS2 (old Windows Unicode) is subset of UTF-16 (today Windows Unicode). Every UCS2 text is UTF-16, just like every ASCII7 text is UTF-8. Delphi's WideString is by definition Windows Unicode (it is COM B_STR datatype), UnicodeString is not B_STR but is Windows Unicode too. C# and Java strings are UTF-16. So, when you loose charset information and do plain bytes transfer - UTF-16 interpretation is what you probably would receive, by default.


BOM letter then MIGHT trigger reconsideration, if some Delphi library would do a fool-proofness check. But that is not granted. To be on safe side you should keep strings (texts) as strings and never switch to bytes, then you might blame libraries if they screw charset information. Alternatively, you can bypass libraries and work with bytes directly, then it would be your responsibility to track and check all the charsets through all the chain and to transcode where needed. When you did ftBlob and LoadFromFile you talked in bytes-not-letters terms. When you use select and db-aware grid


you talk in letters-not-bytes terms. In between there can be mismatches. Now, your database have it as text blob, the letters-not-bytes principle, then the mismatch is (least library bugs) when you pushing the data into the database, on the update or insert statement part for example. And in that step you have to decide you either would work with letter or with bytes, you either would delegate charset tracking and transcoding to libraries or do it yourself and preclude libraries. And those approaches I outlined above in .AsWideString := ... and .AsBytes := ... snippets


UTF-16 interpretation is what you probably would receive, by default - in Delphi 2009+, I mean. Delphi 2007 and prior, and libraries written back then, would rather default to 8-bits MBCS ("ANSI") interpretation of the very same binary data, if you convert bytes to text.
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39775605
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Без BOM как мемо, по-твоему, должен догадаться, что ему скармливают именно utf8?
а что, в дельфях разве нет функции для "автоэнкодинга"?

В лазаре аж три перегруженные функции LoadFromFile (я привел одну из них выше). Наверняка в Дельфях есть то же самое (увы, последняя версия, где я что-то наваял, была XE)
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39775773
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокВ лазаре аж три перегруженные функции LoadFromFile (я привел одну из них выше). Наверняка в Дельфях есть то же самое (увы, последняя версия, где я что-то наваял, была XE)
Именно "авто"? Нету. И в FPC, насколько я вижу по сорцам, тоже нету. Просто там UTF-8 - родная для string, вот она и подставляется дефолтом. А попробуй выставить какой-то там дефайн для отключения UTF-8 в качестве родной, и все, приплыли.
AriochЭто как раз не трудно. У UTF-8 жесткая структура, так что просто попробовать текст как UTF-8, а если не получится (т.е. если текст не является UTF-8) - пробовать уже другие кодировки.
Эм, ну ок
Код: sql
1.
Это как раз не трудно

- корректный UTF-8. И что с ним дальше делать?
Можно определить некоторые случаи, когда текст НЕ в UTF-8. Но это лишь подмножество из возможного количества вариантов
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39775974
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Именно "авто"? Нету. И в FPC, насколько я вижу по сорцам, тоже нету. Просто там UTF-8 - родная для string, вот она и подставляется дефолтом. А попробуй выставить какой-то там дефайн для отключения UTF-8 в качестве родной, и все, приплыли.
Ты прав. Волшебной функции нету, но есть модуль LConvEncoding с волшебной функцией GuessEncoding :) На скорую руку набросал:
код
Код: 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.
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.
function TForm1.GetFileEncoding(var AFileName: String): TEncoding;
var
  tf: TextFile;
  SL: TStringList;
  buff: String[200];
  cnt: Integer;
begin
  Result:= TEncoding.Default;

  try
    AssignFile(tf,AFileName);
    Reset(tf);
    cnt:= 0;

    SL:= TStringList.Create;
    try
      while (not EOF(tf)) and (cnt < 1) do
      begin
        ReadLn(tf,buff);
        if UTF8Length(UTF8Trim(buff)) > 0 then
        begin
          SL.Add(buff) ;
          Inc(cnt);
        end;
      end;

      if cnt = 0 then Exit;

      case GuessEncoding(SL.Strings[0]) of
        EncodingAnsi,
        EncodingCP1250,
        EncodingCP1251,
        EncodingCP1252,
        EncodingCP1253,
        EncodingCP1254,
        EncodingCP1255,
        EncodingCP1256,
        EncodingCP1257,
        EncodingCP1258
                       : Result:= TEncoding.ANSI;
        EncodingUCS2LE : Result:= TEncoding.Unicode;
        EncodingUCS2BE : Result:= TEncoding.BigEndianUnicode;
       EncodingUTF8BOM,
          EncodingUTF8
                       : Result:= TEncoding.UTF8;
        else
          Result:= TEncoding.Default;
      end;

    finally
      FreeAndNil(SL);
    end;
  finally
    CloseFile(tf);
  end;
end;     

procedure TForm1.LoadText(Sender: TObject);
var
  ansi_txt,
  utf8_txt,
  utf8_bom,
  ucs2_be_bom,
  ucs2_le_bom: String;

begin
  ansi_txt:= AppendPathDelim(ExtractFilePath(Application.ExeName)) + 'sometext_cp1251.txt';
  utf8_txt:= AppendPathDelim(ExtractFilePath(Application.ExeName)) + 'sometext_utf8.txt';
  utf8_bom:= AppendPathDelim(ExtractFilePath(Application.ExeName)) + 'sometext_utf8_bom.txt';
  ucs2_be_bom:= AppendPathDelim(ExtractFilePath(Application.ExeName)) + 'sometext_ucs2_be_bom_BE.txt';
  ucs2_le_bom:= AppendPathDelim(ExtractFilePath(Application.ExeName)) + 'sometext_ucs2_le_bom_BE.txt';

  Memo1.Lines.LoadFromFile(ansi_txt,GetFileEncoding(ansi_txt));
  Memo2.Lines.LoadFromFile(utf8_txt,GetFileEncoding(utf8_txt));
  Memo3.Lines.LoadFromFile(utf8_bom,GetFileEncoding(utf8_bom));
  Memo4.Lines.LoadFromFile(ucs2_be_bom,GetFileEncoding(ucs2_be_bom));
  Memo5.Lines.LoadFromFile(ucs2_le_bom,GetFileEncoding(ucs2_le_bom));
end;

картинко
...
Рейтинг: 0 / 0
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
    #39776025
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
справедливости ради замечу, что на fpc 3.0.4 не взлетит (LoadFromFile/LoadFromStream еще не имеют перегруженных аналогов), только хардкор транк :)
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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