2009-12-09 4 views
1

Существующее приложение передает XML в sproc в SQLServer 2000, тип данных входных данных - TEXT; XML получен из Dataset.GetXML(). Но я заметил, что он не указывает кодировку..NET DataSet.GetXml() - что такое кодировка по умолчанию?

Так что, когда пользователь пробирается неуместным символом в набор данных, а именно ASCII 146 (который представляется апострофом) вместо ASCII 39 (одинарная кавычка), sproc терпит неудачу.

Одним из подходов является префиксом результат GetXML с

<?xml version="1.0" encoding="ISO-8859-1"?> 

Он работает в этом случае, но то, что было бы более правильным подходом для обеспечения sproc не сломается (если другие непредвиденные символы всплывал) ?

PS. Я подозреваю, что пользователь печатает текст в MS-Word или аналогичный редактор и копирует & в поля ввода приложения; Я, вероятно, хочу, чтобы пользователь продолжал работать таким образом, просто нужно предотвратить сбои.

EDIT: Я ищу ответы, которые подтверждают или отрицают некоторые аспекты, например:
- в соответствии с заголовком, какова кодировка по умолчанию, если ни один не указан в XML?
- Является ли кодирование ISO-8859-1 правильным для использования?
- если есть лучшая кодировка, которая будет охватывать больше символов в англоязычном мире и, следовательно, с меньшей вероятностью приведет к ошибке в sproc?
- Вы могли бы фильтровать на уровне пользовательского интерфейса приложения для стандартного ASCII (только от 0 до 127) и не разрешать расширенный ASCII?
- любые другие подходящие детали.

ответ

0

DataSet.GetXml() возвращает string. В .NET строки внутренне кодируются с использованием UTF-16, но здесь это не очень важно.

Причина, почему нет <?xml encoding=...> декларации в строке потому, что заявление только полезно или необходимо для разбора XML в потоке в байт. Строка .NET не является потоком байтов, это просто текст с четко определенной семантикой семантики (которая является Unicode), поэтому она там не нужна.

Если XML-объявление кодирования отсутствует, UTF-8 следует принять парсером XML при отсутствии спецификации. В вашем случае, однако, это также совершенно неуместно, так как проблема связана не с парсером XML (XML не анализируется SQL Server, когда он хранится в столбце TEXT). Проблема заключается в том, что ваш XML содержит некоторые символы Unicode, а TEXT - это не-Unicode SQL-тип.

Вы можете кодировать string любой кодировке с использованием метода Encoding.GetBytes().

+0

Неверное предположение, столбец не ТЕКСТ, для приема строки XML используется только параметр типа TEXT; ТЕКСТ используется, поскольку varchar (8000) имеет ограничение по длине; Проблема * есть * с парсером на sqlserver. Сервер: Msg 6603, уровень 16, состояние 1, процедура sp_xml_preparedocument, строка 40 Ошибка синтаксического анализа XML: в текстовом содержимом был найден недопустимый символ. Как я уже сказал, когда я объявляю XML-строку как ISO-8859-1, на sproc ошибки не возникает, поэтому анализатор обрабатывает ASCII 146 как приемлемый. – joedotnot

+0

Проблема по-прежнему 'ТЕКСТ', на самом деле. В частности, когда вы передаете строку «Unicode» в ваш sproc, она должна быть преобразована в кодировку, отличную от Юникода, в соответствии с «TEXT»; результат, конечно, не кодируется с использованием UTF, и какую кодировку, которую он собирается использовать для преобразования, определить нелегко. Если у вас есть контроль над sproc, просто замените 'TEXT' на' NTEXT' и не беспокоитесь о ancodings –

+0

. Я пришел к такому же выводу, чтобы использовать NTEXT непосредственно перед чтением вашего последнего комментария, тогда мне не нужно будет объявлять
? Xml version = "1.0" encoding = "ISO-8859-1"?
, чтобы заставить его работать (или вам не нужно беспокоиться об кодировании, как вы сказали). Не могли бы вы просто прояснить несколько вещей:
вы говорите, что если я использую NTEXT, строка xml, которую я передаю, будет интерпретироваться XML-парсером как UTF-16?
Почему выполняется сохранение TEXT и объявление строки xml как ISO-8859-1? – joedotnot

0

Я считаю, что ваш подход должен заключаться в использовании WriteXml вместо GetXml. Это должно позволить вам указать кодировку.

Однако обратите внимание, что вам придется писать через промежуточный поток - если вы выходите непосредственно в строку, он всегда будет использовать UTF-16. Поскольку вы используете столбец TEXT, это позволит использовать символы недействительными для TEXT.

+0

что с этим делать, как показано в моем примере, конкатенировать [кодировку xml] + DataSet.GetXml()? – joedotnot

+0

1) Не используйте конкатенацию строк для управления XML. Существуют различия в правилах между XML и строками.2) Ваш метод только объявляет, что такое кодировка, - он вообще не меняет кодировку. –

Смежные вопросы