Кодировки
От: Xenia США  
Дата: 28.10.02 15:25
Оценка:
Здравствуйте!
Имеется xml файл в которм явно указана кодирвка, вот так:

<?xml version="1.0" encoding="utf-8"?>
<doc>
 <Nom Area="Лермонтов МСЧ" KategPrinadl="Медико-санитарная часть №101" PodrazdName="Скорая помощь"/>
.......
</doc>


И процедура на SQLServer которая в качестве параметра (ntext) принимает этот текст и засовывает данные в базу.
Так вот при явном указании кодировки, как в приведенном примере, парсер ругается и говорит

XML parsing error: Switch from current encoding to specified encoding not supported.


если кодировку явно не указать в xml файле то работает нормально. В чем проблема может быть?
Re: Кодировки
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 28.10.02 15:51
Оценка:
Здравствуйте Xenia, Вы писали:

X>Здравствуйте!

X>Имеется xml файл в которм явно указана кодирвка, вот так:

X>
X><?xml version="1.0" encoding="utf-8"?>
X><doc>
X> <Nom Area="Лермонтов МСЧ" KategPrinadl="Медико-санитарная часть №101" PodrazdName="Скорая помощь"/>
X>.......
X></doc>
X>


X>И процедура на SQLServer которая в качестве параметра (ntext) принимает этот текст и засовывает данные в базу.

X>Так вот при явном указании кодировки, как в приведенном примере, парсер ругается и говорит

X>
X>XML parsing error: Switch from current encoding to specified encoding not supported.
X>


X>если кодировку явно не указать в xml файле то работает нормально. В чем проблема может быть?


На сколько я понимаю UTF-8, при корректном содержимом первоначального XML ты бы не смогла увидеть русские буквы — они были бы двухсимвольными абро-кадабрами.

Попробуй его отконвертировать через MultiByteToWideChar(CP_ACP,) / WideCharToMultiByte(CP_UTF8,...) и подсунуть полученный текст.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: Кодировки
От: Xenia США  
Дата: 28.10.02 16:40
Оценка:
Здравствуйте Коваленко Дмитрий, Вы писали:


КД>На сколько я понимаю UTF-8, при корректном содержимом первоначального XML ты бы не смогла увидеть русские буквы — они были бы двухсимвольными абро-кадабрами.


КД>Попробуй его отконвертировать через MultiByteToWideChar(CP_ACP,) / WideCharToMultiByte(CP_UTF8,...) и подсунуть полученный текст.


Я не совсем поняла что вы имеете в виду под "корректным" xml файлом, и у меня такой еще вопрос — если xml файл был создан (программно) под windows 98, но processing instruction была усатановлена

<?xml version="1.0" encoding="utf-8"?>


То в итоге какая там получилась кодировка? может в этом вся проблема.
Re: Кодировки
От: Andrey_N  
Дата: 28.10.02 16:55
Оценка:
Здравствуйте Xenia, Вы писали:

X>Здравствуйте!

X>Имеется xml файл в которм явно указана кодирвка, вот так:

X>
X><?xml version="1.0" encoding="utf-8"?>
X><doc>
X> <Nom Area="Лермонтов МСЧ" KategPrinadl="Медико-санитарная часть №101" PodrazdName="Скорая помощь"/>
X>.......
X></doc>
X>


В UTF-8 только латинские буквы будут занимать один байт. Все остальные (в том числе и русские) — больше одного. Поставте кодировку 1251.

Андрей
Re[3]: Кодировки
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 28.10.02 16:58
Оценка:
Здравствуйте Xenia, Вы писали:

X>Здравствуйте Коваленко Дмитрий, Вы писали:


X>

КД>>На сколько я понимаю UTF-8, при корректном содержимом первоначального XML ты бы не смогла увидеть русские буквы — они были бы двухсимвольными абро-кадабрами.

КД>>Попробуй его отконвертировать через MultiByteToWideChar(CP_ACP,) / WideCharToMultiByte(CP_UTF8,...) и подсунуть полученный текст.


X>Я не совсем поняла что вы имеете в виду под "корректным" xml файлом, и у меня такой еще вопрос — если xml файл был создан (программно) под windows 98, но processing instruction была усатановлена


X>
X><?xml version="1.0" encoding="utf-8"?>
X>


X>То в итоге какая там получилась кодировка? может в этом вся проблема.


Давай по-порядку.
  1. encoding="utf-8" означает, что содержимое этого XML определено в кодировке UTF-8. Так?
  2. В этой кодировке символы выше 127 представляются в виде последовательности байт. То есть русские буквы превратятся в "нерусские". Все что ниже 127 останется как есть. То есть английские буквы будут читаемые
  3. В твоем XML русские буквы — читаемые. То есть представлены в кодировке win1251.
  4. Парсер XML, беря твои данные, видит что они в UTF-8 и начинает их конвертировать в UCS-2 — это нормальный 2-х байтный UNICODE. Но UTF-8 это жесткий формат который чувствителен к ошибкам. Русские буквы с кодом >127 однозначно воспринимаются как ошибка и поэтому парсер возвращает ошибку.

Я предлагаю тебе попробовать "руками" переконвертировать твой XML в UTF-8 и подсунуть этот текст серверу. Если пройдет, то будем думать, что делать с твоей (программной) генерацией XML.

CP_UTF8 поддерживается NT4/2000 и выше. Если у тебя их нет под рукой — могу выслать конвертор в исходных текстах (С++)
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: Кодировки
От: Xenia США  
Дата: 28.10.02 17:10
Оценка:
А может мне просто перед закачкой файла в базу программно открыть его как текстовый файл и прибить строчку
<?xml version="1.0" encoding="utf-8"?> ?? А потом уже, без этой строчки передавать как парметр хранимой процедуре?
Re[5]: Кодировки
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.10.02 07:13
Оценка:
Здравствуйте Xenia, Вы писали:

X>А может мне просто перед закачкой файла в базу программно открыть его как текстовый файл и прибить строчку

X><?xml version="1.0" encoding="utf-8"?> ?? А потом уже, без этой строчки передавать как парметр хранимой процедуре?

Эта строка является обязательной для такого рода документов, поскольку описывает версию используемой структуры.

Xenia, если ты не поняла то, что я попросил тебя сделать — вышли на мне этот XML, я перекодирую его в UTF-8 и вышлю тебе его обратно. Ты попробуешь его сохранить в MS SQL и сообщишь всем нам о результатах.

Мой email —
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[5]: Кодировки
От: johann  
Дата: 31.10.02 15:14
Оценка:
Здравствуйте Xenia, Вы писали:

X>А может мне просто перед закачкой файла в базу программно открыть его как текстовый файл и прибить строчку

X><?xml version="1.0" encoding="utf-8"?> ?? А потом уже, без этой строчки передавать как парметр хранимой процедуре?
Вопрос не в том что ты можешь фактически "руками" дописать эту строчку.
Просто дописывая "руками" строчку ты не меняешь фактически содержимое xml-файла (точнее его носителя), соответственно все что было в кодировке Windows-1251 (или что у тебя за кодировка там была) то в ней и осталось. Ошибку же от xml parser'а ты получаешь как раз потому, что добавив строку с кодировкой UTF-8 ты заставляешь его считать, что данные с которыми он работает находятся в этой кодировке. а русские символы в этой кодировке представляются не теми же самым символами что и в Windows-1251 (а именно их он встречает). Поэтому и говорит, что кодировка не та. Если тебе надо преобразовать кодировку "носителя" xml штатными средствами MSXML, загрузи xml-файл и добавь processing instruction примерно так:

// Add encoding processing instruction to the top of the XML file
std::wstring a_string = L"version=\"1.0\" encoding=\"" + а_Encoding + L"\"";
a_xmlDoc->insertBefore(a_xmlDoc->createProcessingInstruction(L"xml",
    a_string.c_str()), _variant_t(a_xmlDoc->firstChild, true));

где m_Encoding -- имя кодировки, a_xmlDoc -- MSXMLDOMDocumentPtr -- тот самый xml документ, который уже загружен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.