C # REST Client - Кодирование специальных символов в XML - PullRequest
2 голосов
/ 26 ноября 2010

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

Ниже приведена тестовая заглушка:

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.

Любая помощь и хиты приветствуются.

Приветствия

Ответы [ 2 ]

1 голос
/ 26 ноября 2010

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

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

В вашем коде измените: xws.Encoding = Encoding.UTF8;

на: xws.Encoding = Encoding.ASCII;

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

0 голосов
/ 26 ноября 2010

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

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

Приведенный выше код выдает вывод "test øæåØÆÅ", который соответствует выводу, найденному с помощью онлайн-конвертера .

...