@Greg: кажется, что Вы отредактировали свой ответ, чтобы быть совершенно другим ответом. К которому мой ответ да, я мог сделать это использование System.Xml, но надеялся намочить ноги с LINQ к XML.
я оставлю свой исходный ответ ниже в случае, если кто-либо еще задается вопросом, почему я не могу только использовать.Value свойство XELEMENT для получения то, в чем я нуждаюсь:
@Greg: свойство Value связывает все текстовое содержание любых дочерних узлов. Таким образом, если элемент тела содержит только текст, это работает, но если это содержит XHTML, я получаю весь текст, связанный вместе, но ни один из тегов.
Я вижу пять потенциальных областей для проблем:
Как вы на самом деле вводите текст в свое .NET-приложение? Если он жестко задан строковым литералом, уверены ли вы, что компилятор принимает правильную кодировку для вашего исходного файла?
Может быть проблема в том, как вы отправляете его в базу данных.
Может быть проблема с тем, как он хранится в базе данных.
Может быть проблема с тем, как вы его загружаете в базу данных.
Может быть проблема с тем, как вы потом снова его отображаете.
Теперь области 2-4 звучат так, как будто они менее вероятны, чем 1 и 5. Как вы затем отображаете текст? Вы на самом деле извлекаете его из базы данных в .NET, или вы используете Toad или что-то подобное, чтобы попытаться увидеть это?
Если вы ' переписывая его снова из .NET, я предлагаю вам полностью пропустить базу данных - если вы просто отобразите саму строку, что вы увидите?
У меня есть статья, которая может оказаться полезной по отладке проблем Unicode . В частности, сосредоточьтесь на каждом месте, где кодировка может работать неправильно, и убедитесь, что всякий раз, когда вы «отображаете» строку, вы выгружаете точные символы Unicode (как целые числа), чтобы вы могли проверить их, а не только то, что ваш текущий шрифт хочет отобразить.
РЕДАКТИРОВАТЬ: Хорошо, значит, база данных где-то участвует в проблеме.
Я настоятельно предлагаю вам удалить что-нибудь вроде ASP и HTML вне уравнения. Напишите простое консольное приложение, которое ничего не делает, кроме вставки строки и повторного получения ее. Сделайте дамп отдельных символов Unicode (в виде целых чисел) до и после. Затем попробуйте посмотреть, что находится в базе данных (например, с помощью Toad). Я не знаю функций Oracle для преобразования строк в последовательности отдельных символов Unicode и последующего преобразования этих символов в целые числа, но это, вполне возможно, будет следующим, что я попробую.
РЕДАКТИРОВАТЬ: Еще два предложения (подходит для см. приложение консоли, кстати).
Укажите тип данных для параметра, а не просто укажите ему объект. Например:
command.Parameters.Add (": UnicodeString", но вполне возможно, что это будет следующее, что я попробую.
РЕДАКТИРОВАТЬ: еще два предложения (приятно видеть консольное приложение, кстати).
Укажите тип данных для параметра, а не просто задавайте ему объект. Например:
command.Parameters.Add (": UnicodeString", но вполне возможно, что это будет следующее, что я попробую.
РЕДАКТИРОВАТЬ: еще два предложения (приятно видеть консольное приложение, кстати).
Укажите тип данных для параметра, а не просто задавайте ему объект. Например:
command.Parameters.Add (": UnicodeString",
OracleType.NVarChar) .Value = stringToSave;
Рассмотрите возможность использования собственного драйвера Oracle вместо встроенного в .NET. Вы можете захотеть сделать это в любом случае, поскольку, как я полагаю, это обычно считается более быстрым и надежным.
Вы можете определить, какой набор символов ваша база данных использует для NCHAR с помощью запроса:
SQL> SELECT VALUE
2 FROM nls_database_parameters
3 WHERE parameter = 'NLS_NCHAR_CHARACTERSET';
VALUE
------------
AL16UTF16
, чтобы проверить правильность конфигурации вашей базы данных, вы можете запустить в SQL * Plus следующее:
SQL> CREATE TABLE unicodedata (ID NUMBER, unicodestring NVARCHAR2(100));
Table created
SQL> INSERT INTO unicodedata VALUES (11, 'Τι κάνεις;');
1 row inserted
SQL> SELECT * FROM unicodedata;
ID UNICODESTRING
---------- ---------------------------------------------------
11 Τι κάνεις;
Еще одна вещь, на которую стоит обратить внимание.
Если вы используете клиент oracle и хотите включить символы Юникода в CommandText, вам следует добавить следующую строку в начало вашего приложения:
System.Environment.SetEnvironmentVariable("ORA_NCHAR_LITERAL_REPLACE", "TRUE");
Это позволит вам, в случае необходимости, использовать следующий синтаксис:
command.CommandText = "INSERT into UNICODEDATA (ID, UNICODESTRING) Values (11, N'Τι κάνεις;')";