.NET DATASET.GETXML () - Что такое кодирование по умолчанию?
-
18-09-2019 - |
Вопрос
Существующее приложение передает XML в SPROC в SQLServer 2000, тип данных входного параметра является текстом; XML получен из DateSet.getXml (). Но я замечаю, что это не указывает кодирование.
Поэтому, когда пользователь пробирается в неподходящем символе в набор данных, в частности ASCII 146 (который, по -видимому, является апострофом) вместо ASCII 39 (одиночная цитата), Sproc не работает.
Одним из подходов является префикс результат getXML с
<?xml version="1.0" encoding="ISO-8859-1"?>
Это работает в этом случае, но что было бы более правильным подходом для обеспечения того, чтобы Sproc не сбой (если появляются другие непредвиденные персонажи)?
Пса Я подозреваю, что пользователь вводит текст в MS-Word или аналогичный редактор и копирует и встает в поля ввода приложения; Я бы, вероятно, хотел бы позволить пользователю продолжать работать таким образом, просто необходимо предотвратить сбои.
РЕДАКТИРОВАТЬ: Я ищу ответы, которые подтверждают или опровергают несколько аспектов, например:
- Согласно заголовку, что кодирование по умолчанию, если никто не указан в XML?
-Кодирование ISO-8859-1 правильным для использования?
- Если есть лучшее кодирование, которое охватывает больше персонажей в англоязычном мире и, следовательно, с меньшей вероятностью вызовет ошибку в Sproc?
- Вы бы отфильтровали на уровне пользовательского интерфейса приложения для стандартного ASCII (только от 0 до 127) и не разрешаете расширенный ASCII?
- любые другие соответствующие детали.
Решение
DataSet.GetXml()
Возвращает а string
. Анкет В .NET строки внутренне закодированы с использованием UTF-16, но это не совсем актуально здесь.
Причина, по которой нет <?xml encoding=...>
Объявление в строке связано с тем, что это объявление полезно или необходимо для анализа XML в байтовый поток. Анкет Строка .NET-это не поток байта, это просто текст с четко определенной семантикой CodePoint (которая является Unicode), поэтому он там не нужен.
Если нет декларации кодирования XML, должен быть принят UTF-8 Парицером XML В отсутствие бом. В вашем случае, однако, это также совершенно не имеет значения, так как проблема не связана с анализатором XML (XML не проанализирован SQL Server, когда он хранится в TEXT
столбец). Проблема в том, что ваш XML содержит некоторые символы Unicode, и TEXT
это тип SQL не Unicode.
Вы можете кодировать string
к любому кодированию с использованием Encoding.GetBytes()
метод
Другие советы
Я считаю, что ваш подход должен заключаться в использовании writexml вместо getxml. Это должно позволить вам указать кодирование.
Тем не менее, обратите внимание, что вам придется написать через промежуточный поток - если вы выводите непосредственно на строку, он всегда будет использовать UTF -16. Поскольку вы используете текстовый столбец, это позволит символам не действителю для текста.