Помогите пожалуйста с запсью/чтеньем XML!!!!
Модератор: Модераторы
Столкнулся с неприятным обстоятельством...
Программу пишу под Linux, решил откомпилировать под Win XP, строковые данные считанные из XML и представленные в визуальных контролах (списки, боксы, мемо) - отображаются вопросиками. Читал что реализация XML в Lazarus работает по умолчанию с UTF8, поэтому сюрприз был довольно неожиданным.
Это можно как то поправить?
Программу пишу под Linux, решил откомпилировать под Win XP, строковые данные считанные из XML и представленные в визуальных контролах (списки, боксы, мемо) - отображаются вопросиками. Читал что реализация XML в Lazarus работает по умолчанию с UTF8, поэтому сюрприз был довольно неожиданным.
Это можно как то поправить?
XML файлы по умолчанию имею кодировку UTF-8, а стандартные средства по работе с DOM деревом имеют кодировку строковых методов WideString/UnicodeString.
При присваивании к переменной типа AnsiString/String происходит неявное преобразование в кодировку локали, а т.к. локаль в Винде cp1251 отсюда вывод.
При присваивании к переменной типа AnsiString/String происходит неявное преобразование в кодировку локали, а т.к. локаль в Винде cp1251 отсюда вывод.
qivi
Сначала посмотрите в какой кодировке у Вас сами XML-файлы.
Сначала посмотрите в какой кодировке у Вас сами XML-файлы.
Vadim писал(а):qivi
Сначала посмотрите в какой кодировке у Вас сами XML-файлы.
XML в UTF8 без сомнений. Видимо всё как говорит Mr.Smart. Я забил, мне не особо нужна виндовс версия.
qivi писал(а):XML в UTF8 без сомнений.
Отсутствие сомнений должно быть подтверждено доказательством.
Отсутствие сомнений должно быть подтверждено доказательством.
Было проверенно.
Но раз Вам уже всё по барабану, тогда действительно, забить - самое правильное решение.
Ради работы под виндовс вставлять костыли перекодировки строк?
qivi писал(а):Ради работы под виндовс вставлять костыли перекодировки строк?
Это не костыли, а нормальное преобразование из WideString в UTF8String;
Код: Выделить всё
UTF8EncodeДобавлено спустя 44 секунды:
А, допустим, если в Линупсе локаль будет отличаться от UTF8?
Mr.Smart писал(а):А, допустим, если в Линупсе локаль будет отличаться от UTF8?
Например, во FreeBSD, установленной по умолчанию, она как раз категорически отличается...
Сегодня вновь попробовал компилировать проект под виндовс, UTF8Encode пробовал использовать и при записи и при чтении XML файлов. Те файлы что были записанны ещё в линукс корректно читаются при использовании UTF8Encode, но вот при записи с использованием UTF8Encode в файл записывается нечто вовсе не utf8, если не использовать при записи UTF8Encode то же кракозябрики которые обратно не читаются.
при этом нужно отметить что все строковые переменные в проекте типа utf8string.
Как гарантировать запись русскоязычного текста в XML файл в кодировке UTF8 не зависимо от системной кодировки или других факторов?
при этом нужно отметить что все строковые переменные в проекте типа utf8string.
Как гарантировать запись русскоязычного текста в XML файл в кодировке UTF8 не зависимо от системной кодировки или других факторов?
qivi писал(а):при этом нужно отметить что все строковые переменные в проекте типа utf8string.
По этому поводу _внимательно_ читаем это: http://sirserge.altai.info/articles/?id=45
и долго размышляем
qivi писал(а):Как гарантировать запись русскоязычного текста в XML файл в кодировке UTF8 не зависимо от системной кодировки или других факторов?
С учетом сказанного выше - окончательный результат присвоить переменной типа RawByteString и снять кодовую страницу со строки
Ещё маленькая оговорочка я пользуюсь релизными версиями Lazarus и FPC так что у меня ещё FPC 2.6.0
qivi писал(а):Ещё маленькая оговорочка я пользуюсь релизными версиями Lazarus и FPC так что у меня ещё FPC 2.6.0
Увы, тогда пардон...
Однако, если для валидной строки UTF в процессе записи в файл все таки проскакивает какое-то преобразование, то для 2.6.0 еще есть возможность отмапить её на байтовый массив, а сам массив уже отписывать через BlockWrite
У меня много данных хранится в XML, и я недавно узнал о нововведениях грядущей версии FPC... не обернётся ли это для меня тем что я не смогу контролировать формат записи строк при использовании DOMXML и мне придётся искать ему замену и переделывать всю программу? Есть ли какой то способ контролировать запись строк в XML?
Люди, помогите пожалуйста разобраться с платформенной независимостью формата (кодировкой) записи строк в 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 файл и читает их обратно. Тестовая платформа 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, для меня критически важно гарантировать запись в определённой кодировке, подскажите как этого добиться?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Код: Выделить всё
Dannie:=F_XML.CreateTextNode(UTF8Decode(Memo1.Lines[n]));