Помогите пожалуйста с запсью/чтеньем XML!!!!

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Столкнулся с неприятным обстоятельством...
Программу пишу под Linux, решил откомпилировать под Win XP, строковые данные считанные из XML и представленные в визуальных контролах (списки, боксы, мемо) - отображаются вопросиками. Читал что реализация XML в Lazarus работает по умолчанию с UTF8, поэтому сюрприз был довольно неожиданным.
Это можно как то поправить?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

XML файлы по умолчанию имею кодировку UTF-8, а стандартные средства по работе с DOM деревом имеют кодировку строковых методов WideString/UnicodeString.
При присваивании к переменной типа AnsiString/String происходит неявное преобразование в кодировку локали, а т.к. локаль в Винде cp1251 отсюда вывод.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

qivi
Сначала посмотрите в какой кодировке у Вас сами XML-файлы.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Vadim писал(а):qivi
Сначала посмотрите в какой кодировке у Вас сами XML-файлы.


XML в UTF8 без сомнений. Видимо всё как говорит Mr.Smart. Я забил, мне не особо нужна виндовс версия.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

qivi писал(а):XML в UTF8 без сомнений.

Отсутствие сомнений должно быть подтверждено доказательством. ;) Но раз Вам уже всё по барабану, тогда действительно, забить - самое правильное решение. :D
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

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

Было проверенно.
Но раз Вам уже всё по барабану, тогда действительно, забить - самое правильное решение. :D

Ради работы под виндовс вставлять костыли перекодировки строк?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

qivi писал(а):Ради работы под виндовс вставлять костыли перекодировки строк?

Это не костыли, а нормальное преобразование из WideString в UTF8String;

Код: Выделить всё

UTF8Encode


Добавлено спустя 44 секунды:
А, допустим, если в Линупсе локаль будет отличаться от UTF8?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Mr.Smart писал(а):А, допустим, если в Линупсе локаль будет отличаться от UTF8?

Например, во FreeBSD, установленной по умолчанию, она как раз категорически отличается... ;)
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Сегодня вновь попробовал компилировать проект под виндовс, UTF8Encode пробовал использовать и при записи и при чтении XML файлов. Те файлы что были записанны ещё в линукс корректно читаются при использовании UTF8Encode, но вот при записи с использованием UTF8Encode в файл записывается нечто вовсе не utf8, если не использовать при записи UTF8Encode то же кракозябрики которые обратно не читаются.

при этом нужно отметить что все строковые переменные в проекте типа utf8string.

Как гарантировать запись русскоязычного текста в XML файл в кодировке UTF8 не зависимо от системной кодировки или других факторов?
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

qivi писал(а):при этом нужно отметить что все строковые переменные в проекте типа utf8string.


По этому поводу _внимательно_ читаем это: http://sirserge.altai.info/articles/?id=45
и долго размышляем

qivi писал(а):Как гарантировать запись русскоязычного текста в XML файл в кодировке UTF8 не зависимо от системной кодировки или других факторов?


С учетом сказанного выше - окончательный результат присвоить переменной типа RawByteString и снять кодовую страницу со строки
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Ещё маленькая оговорочка я пользуюсь релизными версиями Lazarus и FPC так что у меня ещё FPC 2.6.0
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

qivi писал(а):Ещё маленькая оговорочка я пользуюсь релизными версиями Lazarus и FPC так что у меня ещё FPC 2.6.0

Увы, тогда пардон...
Однако, если для валидной строки UTF в процессе записи в файл все таки проскакивает какое-то преобразование, то для 2.6.0 еще есть возможность отмапить её на байтовый массив, а сам массив уже отписывать через BlockWrite
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

У меня много данных хранится в XML, и я недавно узнал о нововведениях грядущей версии FPC... не обернётся ли это для меня тем что я не смогу контролировать формат записи строк при использовании DOMXML и мне придётся искать ему замену и переделывать всю программу? Есть ли какой то способ контролировать запись строк в XML?
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Люди, помогите пожалуйста разобраться с платформенной независимостью формата (кодировкой) записи строк в XML.

Прилагаемый файл демка записывает строки из мемо в XML файл и читает их обратно. Тестовая платформа WinXP, Lazarus 1.0.2, FPC 2.6.0.
Запись в Linux даёт кодировку UTF8, для проверки использую LibreOffice открывая XML файл как кодированный текст и выбирая кодировку UTF8. Точно так же тестирую и файл записанный в WinXP, но в Win он открывается не корректно - кроказябрики. При этом под WinXP он пишет не в ANSI кодировке, что становиться очевидно если открыть файл блокнотом - крокозябрики, однако какая бы там не была кодировка, сама демка (записавшая этот файл) корректно открывает его под WinXP. Файлы записанные демкой под Linux (как показывает проверка LibreOffice действительно UTF8), не открываются корректно этой демкой в Win, и наоборот записанные в Win (в неопределённой мною кодировке) не открываются в Linux.

Моя программа хранит массу данных в XML, для меня критически важно гарантировать запись в определённой кодировке, подскажите как этого добиться?

XML_TEST.zip
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Код: Выделить всё

    Dannie:=F_XML.CreateTextNode(UTF8Decode(Memo1.Lines[n]));
Ответить