2010-11-25 2 views
2

Я работаю над приложением на C#, которое извлекает данные пользователя из Active Directory (используя DirectorySearcher) и отправляет их на удаленный сайт с использованием REST API. Но некоторые имена содержат специальные символы, такие как ØÆÅ и т. Д., И я не могу понять, как их правильно закодировать. API ожидает получить их закодированные как & 230; и т.д.Клиент C# REST - Кодирование специальных символов в XML

Ниже тест заглушки:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Xml; 
using System.IO; 

namespace Encodingtest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      XmlWriterSettings xws = new XmlWriterSettings(); 
      xws.Encoding = Encoding.UTF8; 

      StringWriter sw = new StringWriter(); 
      using (XmlWriter xw = XmlWriter.Create(sw, xws)) 
      { 
       xw.WriteStartElement("test"); 
       xw.WriteElementString("element", "test øæåØÆÅ"); 
       xw.WriteEndElement(); 
       xw.Flush(); 
       xw.Close(); 
      } 
      Console.WriteLine(sw.ToString()); 
      Console.ReadLine(); 
     } 
    } 
} 

Проблема заключается в том, что выход все еще находится в том же формате, что и вход. То есть читаемые датские символы, а не их числовые объекты.

REST API - это приложение Rails. Я предполагаю, что любые данные в приложении C# по умолчанию являются unicode.

Любая помощь и хиты получают высокую оценку.

Приветствия

+0

Звучит так, как будто это приложение Rails должно быть исправлено, но есть обходные пути, если вы не можете заставить их изменить. – 2010-11-26 00:46:34

ответ

1

Любая обработка XML система должна быть в состоянии обрабатывать наборы UTF-8 символов, особенно если кодировка явно объявлен как UTF-8. Эти символы не должны быть закодированы как числовые ссылки на сущности.

Если вы хотите, чтобы эти символы были сериализованы с числовыми объектами, затем установите свою кодировку в меньший набор символов, например ascii или us-ascii.

В коде изменения:xws.Encoding = Encoding.UTF8;

к:xws.Encoding = Encoding.ASCII;

Поскольку эти символы находятся за пределами ascii символьного набора, они будут упорядочены как числовые символьные объекты.

+0

Я тоже это пробовал, и это не сработало. Очевидно, что ASCII сопоставляется с ISO 8859-1, который содержит эти символы. См. Диаграмму: http://www.w3schools.com/tags/ref_entities.asp – 2010-11-27 16:54:07

0

Возможно просто прибегнуть к вашим собственным генератором «числовая ссылка на символ»:

foreach (char c in "test øæåØÆÅ") 
{ 
    string encoding = (int)c >= 0x80 ? String.Format("&{0};",(int)c) : c.ToString(); 
    Console.Write(encoding); 
} 

Приведенный выше код производит вывод "test øæåØÆÅ", который соответствует найденному с online converter.

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