|
|
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Есть бд на firebird3. Программа записывает данные из файла или из memo в blob и обратно- читает из blob в мемо. В бд есть 2 блоб поля: blob_Binary(subtype=0) и Blob_Text(subtype=1,utf-8). Кодировка везде Utf-8. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. end; Когда ввожу текст в мемо на англииском, русском и грузинских языках, вместо грузинских букв в блобах сохраняются кракозябры и иэроглифы (см скрин), хотя при чтении блобы нормально читаются и в обоих мемо отображаются исходные тексты. И иногда, без всяких закономерностей, при чтении текстового блоба выводит такую ошибку: авторEEncodingError 'No mapping for the unicode character exists in the target multi-byte code page' Что делаю неправильно при сохранении данных в блобах, чтобы текстовый блоб был читабельным и как избегать эту ошибку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 03:35 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
кодировка бд и таблицы utf-8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 03:36 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
такие иероглифы сохраняются в обоих блобах, но при чтений в мемо правильно отображается исходный текст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 03:41 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
так сохраняется текстовый файл в обоих блобах. Текст файла видно в мемо1 и мемо2, внизу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 03:46 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
bastibubu, Версию Delphi озвучьте и какие компоненты доступа используете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 07:45 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
В самом приложении, в настройках подключения к базе, надеюсь, кодировку UTF8 указываешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 09:56 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
bastibubuЧто делаю неправильно при сохранении данных в блобах, чтобы текстовый блоб был читабельным и как избегать эту ошибку? если напрямую в IBE редактировать тексты блобов, кракозябров нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 10:20 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
12.02.2019 3:35, bastibubu пишет: > Есть бд на firebird3. Программа записывает данные из файла или из memo в blob и обратно- читает из blob в мемо. какие компоненты доступа? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 12:13 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
X11В самом приложении, в настройках подключения к базе, надеюсь, кодировку UTF8 указываешь? Да, конечно. (см скрин) Мимопроходящийкакие компоненты доступа? FireDac. fdQuery ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 13:48 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 13:49 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
12.02.2019 13:48, bastibubu пишет: > FireDac. fdQuery тряси Арефьева. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 13:49 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Докесли напрямую в IBE редактировать тексты блобов, кракозябров нет? в текстовом нормально читается, в бинарном-нет (см. скрин) goldmi45 Версию Delphi озвучьте и какие компоненты доступа используете. Delphi 10.2.3, компоненты FireDac (fdQuery) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 13:56 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Мимопроходящийтряси Арефьева я бы и Хвастунову еще написал. У него тоже встречаются "неюникодные" таблички ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 15:30 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
bastibubuX11В самом приложении, в настройках подключения к базе, надеюсь, кодировку UTF8 указываешь? Да, конечно. (см скрин)Попробуй указать в настройках соединения FireDac (и только там) UTF-16 Кроме того, к полю текстового блоба можно обращаться через AsString ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 15:54 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Попробуй указать в настройках соединения FireDac (и только там) UTF-16 _Vasilisk_ , нет в комбо такой кодировки _Vasilisk_к полю текстового блоба можно обращаться через AsString При записи или чтении? Напишите, пожалуйста, что вы имеете в виду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 16:37 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
bastibubuнет в комбо такой кодировкиUNICODE_LE bastibubu_Vasilisk_к полю текстового блоба можно обращаться через AsStringПри записи или чтении? Напишите, пожалуйста, что вы имеете в видуВместо bastibubu Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 16:58 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
bastibubuв текстовом нормально читается, в бинарном-нет (см. скрин) потому что средствами IBE в бинарный блоб текст записывается как ANSI, а в текстовый блоб как UTF8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 17:38 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ , работает в случае Blob_Text( и хранит и выводит правильно) а вот в случае бинарного- хранит как иероглифы(ANSI?) хотя выводит нормально. :) Код записи в blob_binary: Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 18:57 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, перепутал с кодом. Это код записи в blob_binary из внешнего текстового файла: Код: pascal 1. 2. 3. в blob_binary получаю иероглифы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 20:27 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
нет, не в бинарном блобе а в blob_text получаю иероглифы. Сильно запутался. :) Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 20:36 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
https://en.wikipedia.org/wiki/Mojibake#Caucasian_languages хотя ничем знание причины не помогает поскольку все уже пробовал и перепроверял. Ж( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 03:00 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
bastibubuв blob_binary получаю иероглифы blob_binary не предназначен для хранения текста. Он предназначен для хранения бинарных данных. Т.е. какие байты туда записали, те же байты и прочитали. Вне зависимости от настроек кодировок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 14:24 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_bastibubuв blob_binary получаю иероглифы blob_binary не предназначен для хранения текста. Он предназначен для хранения бинарных данных. Т.е. какие байты туда записали, те же байты и прочитали. Вне зависимости от настроек кодировок _Vasilisk_ , это я понимаю. Дело в том, что когда я тестировал ваше предложение, оказалось что текстовый файл был в кодировке utf-BOM. В этом случае файл в memo был нормально прочитан но как поменял utf-BOM на utf уже выводил иероглифы Ansi. А мне нужно, наоборот, файл создать в utf поскольку везде кодировка utf (и в бд и в таблице, и в FireDac Connection Definition). И что главное- как быть с китайскими иероглифами в blob_text? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 14:52 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Файл бинарный? Используйте BLOB BINARY и Load/SaveStream Файл текстовый? Используйте BLOB TEXT и AsString. Ничего другого мудрить не нужно. Что не получится из этих рекомендаций - спрашивайте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 15:40 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
bastibubuИ что главное- как быть с китайскими иероглифами в blob_text? "Ох, уж эти сказки ...." © Я же говорю, стучись к Хвастунову. У него грид кракозябры, вероятнее всего, отображает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 16:48 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
ДокУ него грид кракозябры, вероятнее всего, отображаетА как должен? hex-коды? Это бинарный блоб. А если ты туда exe файл засунешь, что он должен отобразить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 16:57 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Док, Тоже самое у меня если достучаться до бд из IBExpert. Здесь все правильно. (см. скрин) Проблема при доступе через Delphi : 1) бинарный блоб ================== Если файл в кодировке utf и сохраняю прямо в бд, то в бинарном блобе текст отображается так что если выводить в мемо, текст нечитабельный. А если файл в кодировке utf_BOM тогда в бинарном блобе правильно сохраняется(как ansi иероглифы) и следовательно и в мемо нормально отображается. 2) текстовый блоб ================== не имеет значения кодировка utf или utf-BOM в текстовом блобе в обоих случаях сохраняются китайские иероглифы. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. https://onedrive.live.com/?id=29624722F45C06E9!102428&cid=29624722F45C06E9 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 18:58 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Если текстовый файл закодирован как "unicode"(noteped) или ucs-2 LE BOM (noteped++) тогда исчезают китаиские иероглифы и файл правильно сохраняется в текстовый блоб. Аналогично, в случае бинарного блоба если файл в utf-BOM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 21:58 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Это бинарный блоб. А если ты туда exe файл засунешь, что он должен отобразить? То, что ты туда засунул. Тебя не смущает, что символы первых 127 символов ASCII (совпадающие с юникодом) отображаются корректно? bastibubuЕсли файл в кодировке utf и сохраняю прямо в бд, то в бинарном блобе текст отображается так что если выводить в мемо, текст нечитабельный. А ты уверен, что твой мемо корректно читает UTF8 без BOM? ЕМНИП, в дельфях есть функции, которые позволяют "угадать" кодировку текста (в Лазаре они есть) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 23:01 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
ДокА ты уверен, что твой мемо корректно читает UTF8 без BOM? Док, спорить с тобой не могу, не исклучаю что так и есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2019, 00:41 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Хотя вряд ли. Тот же самый результат когда файл открываю в RichEdit. Utf8-BOM, Unicode, Unicode Big Endians правильно отображаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2019, 01:01 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
то же самое в случае Jedi(jvMemo). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2019, 01:53 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
bastibubuХотя вряд ли. Да неужели? :) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Не думаю, что в дельфях поведение сильно отличается от Лазаря ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2019, 15:05 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Док, 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++ и правильно сохраняются в обоих блобах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2019, 16:54 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Док , вы можете создать файл в кодировке utf-8 не в простом noteped-а а в noteped++ и сохранить в блобах. Интересно что скажет Lazarus. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2019, 17:04 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
bastibubu, могу, но это будет после 20.00 Мск, когда я домой приду. Все utf8-ные файлы я создавал в Notepad ++, данные в БД грузил скриптом в IBE. В приведенном выше посте для чтения данных пользовал IBX для лазаруса. Но, думается, содержимое бинарного блоба не зависит от того, чем в него пишешь. Для чистоты эксперимента надо запускать этот тест на дельфях. Ладно, руки дойдут, попробую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2019, 17:53 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
В общем, все оказалось, как и подозревал. У Лазаря в редакторе кодовая страница под умолчанию 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. зы. вставку не пробовал, времени нет. Если будет интересно, проект со скриптами базы прилагаю, можешь чуть доработать напильником (из доп.компонентов EhLib и FIBPlus) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2019, 00:00 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Док , большое спасибо вам! Буду еще тестировать. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2019, 02:04 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
bastibubuБуду еще тестировать. :) имей ввиду, что при вставке, возможно , надо будет применять обратную перекодировку AnsiToUtf8, чтобы компоненты доступа "правильно" писали данные в базу. Хотя в мануалах к FB пишется, что данные "перекодируются на лету". :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2019, 08:16 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Докнадо будет применять обратную перекодировку AnsiToUtf8 я имел ввиду бинарный блоб, текстовый блоб имеет явное указание на кодировку, потому с ним проблем нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2019, 08:22 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Док_Vasilisk_Это бинарный блоб. А если ты туда exe файл засунешь, что он должен отобразить?То, что ты туда засунул. Тебя не смущает, что символы первых 127 символов ASCII (совпадающие с юникодом) отображаются корректно?Нет. Мне вообще достаточно надписи (BLOB) и вкладки AsHex. Что там смотреть? Это бинарные нечитаемые данные. Точка. bastibubu1) бинарный блоб ================== Если файл в кодировке utf и сохраняю прямо в бд, то в бинарном блобе текст отображается так что если выводить в мемо, текст нечитабельный.Вот же ж вы настырный. Какое слово из этого _Vasilisk_Файл бинарный? Используйте BLOB BINARY и Load/SaveStream Файл текстовый? Используйте BLOB TEXT и AsString.вам не понятно? Или хочецца? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2019, 16:36 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
_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. Создайте файл в noteped++ как в кодировке utf8 (без BOM), запишите там 'Hello Привет ' или что-нибудь и открывайте в мемо. Думаю получите тот же результат. P.S. Простой noteped не подойдет. Там нет utf8 without BOM. Там есть только utf8-BOM. P.P.S. Unicode (noteped)=ucs-2 BE BOM(Noteped++) работают как часы- правильно загружает текст в обоих блобах, и в мемо, и из мемо в блобах и из блобы в мемо/richedit. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2019, 18:26 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Что там смотреть? Это бинарные нечитаемые данные. Точка. да расслабься уже, выходные жеж :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2019, 19:00 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
bastibubuСоздайте файл в noteped++ как в кодировке utf8 (без BOM), запишите там 'Hello Привет ' или что-нибудь и открывайте в мемо. Думаю получите тот же результат. Все правильно. Без BOM как мемо, по-твоему, должен догадаться, что ему скармливают именно utf8? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2019, 10:25 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Василий 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2019, 13:00 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
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.TMemoField 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2019, 13:04 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Василий 2Без BOM как мемо, по-твоему, должен догадаться, что ему скармливают именно utf8? а что, в дельфях разве нет функции для "автоэнкодинга"? В лазаре аж три перегруженные функции LoadFromFile (я привел одну из них выше). Наверняка в Дельфях есть то же самое (увы, последняя версия, где я что-то наваял, была XE) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2019, 15:02 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
ДокВ лазаре аж три перегруженные функции LoadFromFile (я привел одну из них выше). Наверняка в Дельфях есть то же самое (увы, последняя версия, где я что-то наваял, была XE) Именно "авто"? Нету. И в FPC, насколько я вижу по сорцам, тоже нету. Просто там UTF-8 - родная для string, вот она и подставляется дефолтом. А попробуй выставить какой-то там дефайн для отключения UTF-8 в качестве родной, и все, приплыли. AriochЭто как раз не трудно. У UTF-8 жесткая структура, так что просто попробовать текст как UTF-8, а если не получится (т.е. если текст не является UTF-8) - пробовать уже другие кодировки. Эм, ну ок Код: sql 1. - корректный UTF-8. И что с ним дальше делать? Можно определить некоторые случаи, когда текст НЕ в UTF-8. Но это лишь подмножество из возможного количества вариантов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2019, 17:19 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Василий 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2019, 01:10 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
справедливости ради замечу, что на fpc 3.0.4 не взлетит (LoadFromFile/LoadFromStream еще не имеют перегруженных аналогов), только хардкор транк :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2019, 09:24 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
ДокВолшебной функции нету, но есть модуль LConvEncoding с волшебной функцией GuessEncoding :) А ты посмотри ее код xD какая там магия, тупо проверка БОМ-ов, прогон по <#128, преобразование utf8, а в финале - ТА-ДАММ - Result:=GetDefaultTextEncoding; // use system encoding ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2019, 10:12 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Василий 2финале - ТА-ДАММ - Result:=GetDefaultTextEncoding; // use system encoding "Так тебе шашечки или ехать?" © Ты об чем споришь сейчас? Или приведенный мною способ проблемы ТС не решает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2019, 10:22 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Проблему ТС решает LoadFromFile('...', TEncoding.UTF8), ну или чуть более универсально - try u8s := Utf8String(Buffer) except {это явно не UTF8} end (лень проверять, выкинет ли неявный каст эксепшен, идея, надеюсь, понятна). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2019, 10:35 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Василий 2Проблему ТС решает LoadFromFile('...', TEncoding.UTF8) Возможно. Кодировки для меня - явление новое, с учётом специфики лазаря ещё могут быть ещё и отличия от дельфей. Будет время, поэкспериментирую для личного опыта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2019, 11:13 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Док Волшебной функции нету, но есть модуль LConvEncoding с волшебной функцией GuessEncoding :) Док, есть ещё GetBufferEncoding:This example determines the encoding of a source file and then writes the file in any encoding chosen. http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/TEncoding_(Delphi) Василий 2Проблему ТС решает LoadFromFile('...', TEncoding.UTF8), ну или чуть более универсально - try u8s := Utf8String(Buffer) except {это явно не UTF8} end Василий 2, пробовал и такую перегруженную процедуру LoadFromFile('...', TEncoding.UTF8), но это недостаточно, с этим или без него результат один, а Utf8String(Buffer) пока не использовал. Главное что причину прояснил и сейчас файл сохраняю как BOM (utf8, unicode, unicode big endian) и проблема снята- китайские иероглифы исчезли и в бинарном блобе текст правильно сохраняется из rtf-файла/memo/richedit и загружается обратно. На этом этапе мне и это достаточно. Если кому-то интересно очень помогли эти статьи: http://docwiki.embarcadero.com/RADStudio/Berlin/en/Unicode_in_RAD_Studio#Summary_of_What_Has_Not_Changed http://docwiki.embarcadero.com/RADStudio/Berlin/en/UTF-8_Conversion_Routines ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2019, 15:21 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Василий 2 Код: sql 1. - корректный UTF-8. И что с ним дальше делать? Можно определить некоторые случаи, когда текст НЕ в UTF-8. Но это лишь подмножество из возможного количества вариантов что делать? обрабатывать. Да, это лишь подмножества. Корректные тексты вообще - лишь подмножества из всех возможных сочетаний байтов. Да, кстати, если ещё не сталкивались. У великолепнейшего класса TEncoding есть ещё одна фишка - он НЕ возвращает ошибок. Т.е. при скармливании тому же TEncoding.UTF8 некорректного текста - он вернёт не ошибку, а пустую строку. Особенно это было весело, когда нужно было древний проект (Delphi 5, данные хранились в БД в виде DFM, названия этих потомков TComponent были в windows-1251 (формально так нельзя, но никто не проверял и не запрещал)) перевести на новые юникодные Delphi (где это формально можно, но в UTF-8). Пришлось создавать собственный "двойной" TEncoding и патчить в памяти то ли TComponent, то ли TReader, то ли оба ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2019, 15:48 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Докесть модуль LConvEncoding с волшебной функцией GuessEncoding есть с древнейших времён TCode от Alex Boiko но она работает только с русским языком и совсем не работает с остальными опять, блин, только лишь подмножество..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2019, 15:49 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Arioch, т.е., например, в Берлин Хеми она не сработает, если р и X латинские? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2019, 16:20 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Gator, там всё остальное русское :-) попробуй. вообще, статистика накапливается на больших массивах слов, два слова это всё равно голодный паёк для статистики ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2019, 16:42 |
|
||
|
Кракозябры и иероглифы при чтении и записи из текстового файла или Memo в blob и обратно
|
|||
|---|---|---|---|
|
#18+
Arioch, Тут не слова, а тупо фиксированный справочник фирм, и туева хуча тупых баб, которые руками отправляли названия ручками. Сохласен, пример неудачен. Чаще попадались лати латинские названия с кир.буквами. ________________ Мне насрать, давно, У меня русский редко попадает, чего не скажешь о датчах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2019, 19:02 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2039795]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
180ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 479ms |

| 0 / 0 |
