Передать XML на Postgres в исходной кодировке | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Добрый день!
Впервые столкнулся с таким явлением и никогда не задумывался о кодировке XML-файлов, но точно попадались и UTF8, однако то было при SQL Server. Я преобразую файл в строку при помощи FILETOSTR() и отправляю параметром в функцию Postgres для разбора. Однако при кодировке UTF8 FILETOSTR() уродует строку и, разумеется, данные в таблицах после обработки такой строки изображаются уже не кириллицей, а каракулями. Подскажите, пожалуйста, есть ли универсальный способ передать файл таким образом в исходной кодировке или надо специально анализировать первую строку XML на предмет определения кодировки и делать обратное преобразование с помощью STRCONV()? |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
Как? С чего решили, что он что-то уродует? Цитата:А какая кодировка исходная? Цитата:Ну, наверное её таки не просто так сделали? ------------------ Лень - это неосознанная мудрость. |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
akvvohinc Сообщений: 4218 Откуда: Москва Дата регистрации: 11.11.2008 |
Цитата: Выполните STRTOFILE(FILETOSTR(<filename1> ), <filename2> ), сравните filename1 и filename2, потом сделаете вывод, изуродовал ли FILETOSTR() строку. Если скажете, что, возможно, STRTOFILE() восстанавливает "уродство", нанесённое FILETOSTR(), то сохраните строку не через STRTOFILE(), а каким-то другим способом, например, FWRITE(). Исправлено 2 раз(а). Последнее : akvvohinc, 22.07.21 05:40 |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
pasha_usue Сообщений: 3649 Откуда: Е-бург Дата регистрации: 06.10.2006 |
Насколько я помню в фоксе:
1. надо файл представить как blob; 2. через параметр запроса передать этот blob. Это самое быстрое. Как вариант - каким-нибудь способом сериализовать файл на стороне фокса и десериализовать на постгресе. PS. А хотя, должен и из переменной затянуть параметром. Не помню что именно я через blob обходил. Исправлено 1 раз(а). Последнее : pasha_usue, 22.07.21 07:50 |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Цитата:А решил, что уродует, потому что любой редактор, даже Блокнот, показывает файл в кириллице (в кодировке файла), а FILETOSTR() нет. Очевидно, в отличие от них он не распознаёт кодировку, а показывает содержимое всегда в win1251. Хочется, конечно, получить правильную строку без лишних усилий, не задумываясь о кодировке, как в редакторе. Да, STRTOFILE(FILETOSTR(<filename1> ), <filename2> ) восстанавливает файл, но зачем мне ещё один исходный файл? При считывании файла путём FGETS() происходит аналогичое искажение символов. Опять же, FWRITE() пишет в файл, а я хочу получить правильную строку из файла. Пока решением видится STRCOV(). Разве что файл представить как blob, только способа не нашёл. |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
И давно ли фокспрошная функция стала редактором? Цитата:Интересно, где и как это она(функция) ПОКАЗЫВАЕТ? ------------------ Лень - это неосознанная мудрость. |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
Владимир Максимов Сообщений: 14098 Откуда: Москва Дата регистрации: 02.09.2000 |
FoxPro - не поддерживает UNICODE. Никак. От слова "совсем". Любой текст в среде FoxPro - это всегда текст в текущей кодовой странице. Для русскоязычных приложений - это обычно Win1251
Но! Это только в том случае, если Вы относитесь к содержимому файла именно как к тексту. Но реально-то это просто последовательность байт, которую можно (при желании) интерпретировать как текст С точки зрения FoxPro файл в любом формате UNICODE текстом не является. Это некая бинарная последовательность нулей и единиц. Вот как набору байтов к нему и надо относится. FileToStr() ничего "не портит". Он делает ровно то, для чего предназначен. Копирует содержимое файла в переменную памяти. А вот как Вы дальше это самое содержимое будете использовать - это уже Ваши проблемы Судя по всему, Вы посчитали, что теперь это самое содержимое - это текст. Но в случае файла в формате UNICODE это не так. Для FoxPro - это НЕ текст. Это именно что набор байтов Т.е. вопрос сводится к тому, а как Вы используете полученное значение? Приведите пример кода где Вы передаете значение в Postgres |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
akvvohinc Сообщений: 4218 Откуда: Москва Дата регистрации: 11.11.2008 |
Цитата: Я предполагал, что вы сделаете другой вывод - FILETOSTR() ничего не портит. Ну, если для вас основа для выводов - то, как показывается файл в (любом) редакторе, то я могу лишь умыть руки - не хочется объяснять азы, никаким образом с Фоксом не связанные, сорри. Тем более, что Владимир уже решил пойти эти путём. Исправлено 3 раз(а). Последнее : akvvohinc, 22.07.21 17:00 |
Передать XML на Postgres в исходной кодировке | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Цитата:Я бы вполне удовлетворился оригинальным представлением без прочих возможностей редакторов. Если результат не транслируется прямо в мозг, можно перед ней и cобой поставить знак "?". Именно, что портит, потому что её результатом я пользоваться не могу. Гипотетически, имей она ещё параметр типа кодовой страницы (что-то наподобие симбиоза со STRCONV()), то да - было бы идеально. Но чего нет, того нет. Для меня основа - передача данных на сервер без искажения. Видимо, FILETOSTR() сама по себе не удовлетворяет этому требованию. Вот так. m.xml=FILETOSTR(pFile) SQLEXEC(h, 'SELECT * FROM схема.функция(?m.xml::text, другие параметры);') Надеюсь, STRCONV() решит проблему. |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
Владимир Максимов Сообщений: 14098 Откуда: Москва Дата регистрации: 02.09.2000 |
FileToStr() скопировала содержимое файла в переменную памяти m.xml. Скопировал "как есть". А вот дальше Вы решили, что содержимое переменной памяти m.xml - это текст в формате Win1251 и так ее и стали использовать. Разумеется, получили проблемы Т.е. Вам надо или сначала при помощи StrConv() преобразовать содержимое переменной памяти m.xml в кодировку Win1251 и использовать написанный код. Или же передать переменную памяти m.xml как бинарную последовательность, а уже на стороне Postgres каким-то образом преобразовать эту двоичную строку в нужный формат Как альтернативное решение можно попробовать использовать DOMDocument. Как-то так
Но здесь не уверен. Проверять надо... |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
Да неужели?! Вот так вот взять и попросить ни разу не юникодный фокс показать "правильно" юникодный текст? И где вы набрались таких знаний? Цитата:Ничего на не портит. Портят всё ваши ... своеобразные представления о её работе. Цитата:Угу, потому что хотите он неё странного. Цитата:Комбинация упомянутых функций как раз и делает желаемое вами. Правда тут сам XML кое-что ещё подкидывает. Цитата:Удовлетворяет. Пользоваться надо правильно. Цитата:В вашем случае ее решит. Ибо надо не только переконвертировать, но еще информацию об этом кое-где сохранить. Вот тогда комбинация StrConv(Filetostr()) и даст нужный результа. ------------------ Лень - это неосознанная мудрость. Исправлено 1 раз(а). Последнее : ssa, 23.07.21 16:10 |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
К сожалению, так не пойдёт, что и показал опыт. Цитата:Нужно загружать строку, а строка-то уже не та. Буду пользоваться STRCONV(), и придётся самолично проверять содержимое 1-й строки. Единственное, что озадачило - проблема возникла впервые при отправке файлов таким образом. С SQL Server уже не поэкспериментировать. |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
Кстати, о птичках. ТО бишь о первой строке. Если она заполнена правильно, то и STRConv() не понадобится. ------------------ Лень - это неосознанная мудрость. |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Придётся дополнительно покаяться, что я мысленно наделил эту чудесную функцию дополнительными, чуждыми ей, возможностями, заглядевшись на этот пресловутый XML-файл во всяких редакторах, оторвавшись от реальности в предвкушении очередной лёгкой расчленёнки его на записи. За это и был наказан. С другой стороны, мощь её так велика, что выданный ею полуфабрикат, оказалось, вполне можно довести до кондиции. Пребывая в отчаянии от первой неудачи, не сразу сообразил. Но вы должны понять, гоняясь за простыми решениями, иного способа заграбастать файл в строку не нашёл. |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
В орнитологии я совсем плох. А что понадобится? Полученная строка никак не устраивает Postgres. |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
Первая строка такого файла должна указывать кодировку, в которой файл создан. И если он создан в windows-1251, то и в первой строке должна быть указана именно эта кодировка. И при правильном указании кодировки в первой строке XML спокойно принимается любыми парсерами правильно. И нет необходимости в перекодировках. ------------------ Лень - это неосознанная мудрость. |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
Владимир Максимов Сообщений: 14098 Откуда: Москва Дата регистрации: 02.09.2000 |
Надо смотреть "вокруг". Задача загрузки из файл стандартная и востребованная. Значит, должен быть метод Кроме метода DOMDocument::LoadXML(), который из строки загружает, есть еще метод DOMDocument::Load(), который как раз из файла берет Цитата: |
Re: Передать XML на Postgres в исходной кодировке | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Так бы, конечно, сработало, открывай и читай процедура файл из доступного каталога сама. Но его местонахождение известно лишь пользователю. Кроме того, в процедуру необходимо направить уточняющие параметры для последующей (сразу после разбора) обработки. Поэтому он отправляется туда строкой в сопровождении дополнительных параметров. Точнее, пока ограничиться передачей в процедуру пути к файлу не представляется возможным. Спасибо. Вот так получается правильно распознанная строка. |
© 2000-2024 Fox Club  |