:: Visual Foxpro, Foxpro for DOS
Передать XML на Postgres в исходной кодировке
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Добрый день!
Впервые столкнулся с таким явлением и никогда не задумывался о кодировке XML-файлов, но точно попадались и UTF8, однако то было при SQL Server.
Я преобразую файл в строку при помощи FILETOSTR() и отправляю параметром в функцию Postgres для разбора. Однако при кодировке UTF8 FILETOSTR() уродует строку и, разумеется, данные в таблицах после обработки такой строки изображаются уже не кириллицей, а каракулями.
Подскажите, пожалуйста, есть ли универсальный способ передать файл таким образом в исходной кодировке или надо специально анализировать первую строку XML на предмет определения кодировки и делать обратное преобразование с помощью STRCONV()?
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Аркадий
при кодировке UTF8 FILETOSTR() уродует строку
Как? С чего решили, что он что-то уродует?
Цитата:
Подскажите, пожалуйста, есть ли универсальный способ передать файл таким образом в исходной кодировке
А какая кодировка исходная?
Цитата:
или надо специально анализировать первую строку XML на предмет определения кодировки и делать обратное преобразование с помощью STRCONV()?
Ну, наверное её таки не просто так сделали?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
akvvohinc

Сообщений: 4218
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Однако при кодировке UTF8 FILETOSTR() уродует строку

Выполните STRTOFILE(FILETOSTR(<filename1> ), <filename2> ), сравните filename1 и filename2, потом сделаете вывод, изуродовал ли FILETOSTR() строку.

Если скажете, что, возможно, STRTOFILE() восстанавливает "уродство", нанесённое FILETOSTR(), то сохраните строку не через STRTOFILE(), а каким-то другим способом, например, FWRITE().



Исправлено 2 раз(а). Последнее : akvvohinc, 22.07.21 05:40
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Насколько я помню в фоксе:
1. надо файл представить как blob;
2. через параметр запроса передать этот blob.

Это самое быстрое. Как вариант - каким-нибудь способом сериализовать файл на стороне фокса и десериализовать на постгресе.

PS. А хотя, должен и из переменной затянуть параметром. Не помню что именно я через blob обходил.



Исправлено 1 раз(а). Последнее : pasha_usue, 22.07.21 07:50
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Цитата:
Как? С чего решили, что он что-то уродует?
А решил, что уродует, потому что любой редактор, даже Блокнот, показывает файл в кириллице (в кодировке файла), а FILETOSTR() нет. Очевидно, в отличие от них он не распознаёт кодировку, а показывает содержимое всегда в win1251.
Хочется, конечно, получить правильную строку без лишних усилий, не задумываясь о кодировке, как в редакторе.

akvvohinc
Выполните STRTOFILE(FILETOSTR(<filename1> ), <filename2> ), сравните filename1 и filename2, потом сделаете вывод, изуродовал ли FILETOSTR() строку.

Если скажете, что, возможно, STRTOFILE() восстанавливает "уродство", нанесённое FILETOSTR(), то сохраните строку не через STRTOFILE(), а каким-то другим способом, например, FWRITE().
Да, STRTOFILE(FILETOSTR(<filename1> ), <filename2> ) восстанавливает файл, но зачем мне ещё один исходный файл?
При считывании файла путём FGETS() происходит аналогичое искажение символов. Опять же, FWRITE() пишет в файл, а я хочу получить правильную строку из файла.

Пока решением видится STRCOV().
Разве что файл представить как blob, только способа не нашёл.
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Аркадий
Цитата:
Как? С чего решили, что он что-то уродует?
А решил, что уродует, потому что любой редактор, даже Блокнот, показывает файл в кириллице (в кодировке файла), а FILETOSTR() нет.
И давно ли фокспрошная функция стала редактором?
Цитата:
Очевидно, в отличие от них он не распознаёт кодировку, а показывает содержимое всегда в win1251.
Интересно, где и как это она(функция) ПОКАЗЫВАЕТ?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
FoxPro - не поддерживает UNICODE. Никак. От слова "совсем". Любой текст в среде FoxPro - это всегда текст в текущей кодовой странице. Для русскоязычных приложений - это обычно Win1251

Но! Это только в том случае, если Вы относитесь к содержимому файла именно как к тексту. Но реально-то это просто последовательность байт, которую можно (при желании) интерпретировать как текст

С точки зрения FoxPro файл в любом формате UNICODE текстом не является. Это некая бинарная последовательность нулей и единиц. Вот как набору байтов к нему и надо относится.

FileToStr() ничего "не портит". Он делает ровно то, для чего предназначен. Копирует содержимое файла в переменную памяти. А вот как Вы дальше это самое содержимое будете использовать - это уже Ваши проблемы

Судя по всему, Вы посчитали, что теперь это самое содержимое - это текст. Но в случае файла в формате UNICODE это не так. Для FoxPro - это НЕ текст. Это именно что набор байтов

Т.е. вопрос сводится к тому, а как Вы используете полученное значение? Приведите пример кода где Вы передаете значение в Postgres
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
akvvohinc

Сообщений: 4218
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Да, STRTOFILE(FILETOSTR(<filename1> ), <filename2> ) восстанавливает файл, но зачем мне ещё один исходный файл?

Я предполагал, что вы сделаете другой вывод - FILETOSTR() ничего не портит.
Ну, если для вас основа для выводов - то, как показывается файл в (любом) редакторе, то я могу лишь умыть руки - не хочется объяснять азы, никаким образом с Фоксом не связанные, сорри.
Тем более, что Владимир уже решил пойти эти путём.



Исправлено 3 раз(а). Последнее : akvvohinc, 22.07.21 17:00
Ratings: 0 negative/0 positive
Передать XML на Postgres в исходной кодировке
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Цитата:
И давно ли фокспрошная функция стала редактором?
Я бы вполне удовлетворился оригинальным представлением без прочих возможностей редакторов.

ssa
Интересно, где и как это она(функция) ПОКАЗЫВАЕТ?
Если результат не транслируется прямо в мозг, можно перед ней и cобой поставить знак "?".

akvvohinc
Я предполагал, что вы сделаете другой вывод - FILETOSTR() ничего не портит
Именно, что портит, потому что её результатом я пользоваться не могу. Гипотетически, имей она ещё параметр типа кодовой страницы (что-то наподобие симбиоза со STRCONV()), то да - было бы идеально. Но чего нет, того нет.

akvvohinc
Ну, если для вас основа для выводов - то, как показывается файл в (любом) редакторе, то я могу лишь умыть руки - не хочется объяснять азы, никаким образом с Фоксом не связанные, сорри.
Для меня основа - передача данных на сервер без искажения. Видимо, FILETOSTR() сама по себе не удовлетворяет этому требованию.

Владимир Максимов
Приведите пример кода где Вы передаете значение в Postgres
Вот так.
m.xml=FILETOSTR(pFile)
SQLEXEC(h, 'SELECT * FROM схема.функция(?m.xml::text, другие параметры);')

Надеюсь, STRCONV() решит проблему.
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
Аркадий
Владимир Максимов
Приведите пример кода где Вы передаете значение в Postgres
Вот так.
m.xml=FILETOSTR(pFile)
SQLEXEC(h, 'SELECT * FROM схема.функция(?m.xml::text, другие параметры);')

Надеюсь, STRCONV() решит проблему.

FileToStr() скопировала содержимое файла в переменную памяти m.xml. Скопировал "как есть". А вот дальше Вы решили, что содержимое переменной памяти m.xml - это текст в формате Win1251 и так ее и стали использовать. Разумеется, получили проблемы

Т.е. Вам надо или сначала при помощи StrConv() преобразовать содержимое переменной памяти m.xml в кодировку Win1251 и использовать написанный код.

Или же передать переменную памяти m.xml как бинарную последовательность, а уже на стороне Postgres каким-то образом преобразовать эту двоичную строку в нужный формат

Как альтернативное решение можно попробовать использовать DOMDocument. Как-то так

local loXDOM
loXDOM = CREATEOBJECT('MSXML2.DOMDocument')
loXDOM.loadXML(pFile)
m.xml = loXDOM.xml

Но здесь не уверен. Проверять надо...
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Аркадий
ssa
Интересно, где и как это она(функция) ПОКАЗЫВАЕТ?
Если результат не транслируется прямо в мозг, можно перед ней и cобой поставить знак "?".
Да неужели?! Вот так вот взять и попросить ни разу не юникодный фокс показать "правильно" юникодный текст? И где вы набрались таких знаний?
Цитата:
akvvohinc
Я предполагал, что вы сделаете другой вывод - FILETOSTR() ничего не портит
Именно, что портит,
Ничего на не портит. Портят всё ваши ... своеобразные представления о её работе.
Цитата:
потому что её результатом я пользоваться не могу
Угу, потому что хотите он неё странного.
Цитата:
. Гипотетически, имей она ещё параметр типа кодовой страницы (что-то наподобие симбиоза со STRCONV()), то да - было бы идеально. Но чего нет, того нет.
Комбинация упомянутых функций как раз и делает желаемое вами. Правда тут сам XML кое-что ещё подкидывает.
Цитата:

akvvohinc
Ну, если для вас основа для выводов - то, как показывается файл в (любом) редакторе, то я могу лишь умыть руки - не хочется объяснять азы, никаким образом с Фоксом не связанные, сорри.
Для меня основа - передача данных на сервер без искажения. Видимо, FILETOSTR() сама по себе не удовлетворяет этому требованию.
Удовлетворяет. Пользоваться надо правильно.
Цитата:


Владимир Максимов
Приведите пример кода где Вы передаете значение в Postgres
Вот так.
m.xml=FILETOSTR(pFile)
SQLEXEC(h, 'SELECT * FROM схема.функция(?m.xml::text, другие параметры);')

Надеюсь, STRCONV() решит проблему.
В вашем случае ее решит. Ибо надо не только переконвертировать, но еще информацию об этом кое-где сохранить. Вот тогда комбинация StrConv(Filetostr()) и даст нужный результа.

------------------
Лень - это неосознанная мудрость.




Исправлено 1 раз(а). Последнее : ssa, 23.07.21 16:10
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Владимир Максимов
local loXDOM
loXDOM = CREATEOBJECT('MSXML2.DOMDocument')
loXDOM.loadXML(pFile)
m.xml = loXDOM.xml

К сожалению, так не пойдёт, что и показал опыт.
Цитата:
public DOMDocument::loadXML(string $source, int $options = 0): DOMDocument|bool
Загружает XML-документ из строки.
Список параметров ¶
source Содержащая XML-строка.
Нужно загружать строку, а строка-то уже не та.
Буду пользоваться STRCONV(), и придётся самолично проверять содержимое 1-й строки.

Единственное, что озадачило - проблема возникла впервые при отправке файлов таким образом. С SQL Server уже не поэкспериментировать.
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Аркадий
Буду пользоваться STRCONV(), и придётся самолично проверять содержимое 1-й строки.
Кстати, о птичках. ТО бишь о первой строке. Если она заполнена правильно, то и STRConv() не понадобится.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
ssa
Да неужели?! Вот так вот взять и попросить ни разу не юникодный фокс показать "правильно" юникодный текст? И где вы набрались таких знаний?
Цитата:

akvvohinc
Я предполагал, что вы сделаете другой вывод - FILETOSTR() ничего не портит

Именно, что портит,

Ничего на не портит. Портят всё ваши ... своеобразные представления о её работе.
Придётся дополнительно покаяться, что я мысленно наделил эту чудесную функцию дополнительными, чуждыми ей, возможностями, заглядевшись на этот пресловутый XML-файл во всяких редакторах, оторвавшись от реальности в предвкушении очередной лёгкой расчленёнки его на записи.
За это и был наказан.
С другой стороны, мощь её так велика, что выданный ею полуфабрикат, оказалось, вполне можно довести до кондиции. Пребывая в отчаянии от первой неудачи, не сразу сообразил.
Но вы должны понять, гоняясь за простыми решениями, иного способа заграбастать файл в строку не нашёл.
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
ssa
Кстати, о птичках. ТО бишь о первой строке. Если она заполнена правильно, то и STRConv() не понадобится.
В орнитологии я совсем плох. А что понадобится? Полученная строка никак не устраивает Postgres.
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Аркадий
ssa
Кстати, о птичках. ТО бишь о первой строке. Если она заполнена правильно, то и STRConv() не понадобится.
В орнитологии я совсем плох. А что понадобится? Полученная строка никак не устраивает Postgres.
Первая строка такого файла должна указывать кодировку, в которой файл создан. И если он создан в windows-1251, то и в первой строке должна быть указана именно эта кодировка. И при правильном указании кодировки в первой строке XML спокойно принимается любыми парсерами правильно. И нет необходимости в перекодировках.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
Аркадий
Владимир Максимов
local loXDOM
loXDOM = CREATEOBJECT('MSXML2.DOMDocument')
loXDOM.loadXML(pFile)
m.xml = loXDOM.xml

К сожалению, так не пойдёт, что и показал опыт.
Цитата:
public DOMDocument::loadXML(string $source, int $options = 0): DOMDocument|bool
Загружает XML-документ из строки.
Список параметров ¶
source Содержащая XML-строка.

Надо смотреть "вокруг". Задача загрузки из файл стандартная и востребованная. Значит, должен быть метод

Кроме метода DOMDocument::LoadXML(), который из строки загружает, есть еще метод DOMDocument::Load(), который как раз из файла берет

Цитата:
public DOMDocument::load(string $filename, int $options = 0): DOMDocument|bool

Загружает XML-документ из файла.
Ratings: 0 negative/0 positive
Re: Передать XML на Postgres в исходной кодировке
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
ssa
Первая строка такого файла должна указывать кодировку, в которой файл создан. И если он создан в windows-1251, то и в первой строке должна быть указана именно эта кодировка. И при правильном указании кодировки в первой строке XML спокойно принимается любыми парсерами правильно. И нет необходимости в перекодировках.
Так бы, конечно, сработало, открывай и читай процедура файл из доступного каталога сама. Но его местонахождение известно лишь пользователю. Кроме того, в процедуру необходимо направить уточняющие параметры для последующей (сразу после разбора) обработки. Поэтому он отправляется туда строкой в сопровождении дополнительных параметров. Точнее, пока ограничиться передачей в процедуру пути к файлу не представляется возможным.

Владимир Максимов
DOMDocument::Load()
Спасибо. Вот так получается правильно распознанная строка.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 26 qw2  (Гостей: 25)

© 2000-2024 Fox Club 
Яндекс.Метрика