C#REST Client - 在XML中编码特殊字符

时间:2010-11-25 23:54:11

标签: c# xml api rest encoding

我正在使用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#app中的任何数据都是unicode。

非常感谢任何帮助和点击。

干杯

2 个答案:

答案 0 :(得分:1)

任何系统处理XML都应该能够处理UTF-8字符集,尤其是在编码显式声明为UTF-8的情况下。这些字符不应该被编码为数字实体引用。

如果要确保使用数字实体序列化这些字符,请将编码设置为较小的字符集,例如asciius-ascii

在您的代码中,更改: xws.Encoding = Encoding.UTF8;

来: xws.Encoding = Encoding.ASCII;

由于这些字符在ascii字符集之外,因此它们将被序列化为数字字符实体。

答案 1 :(得分:0)

也许只是求助于你自己的“数字字符引用”生成器:

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

上面的代码会生成与online converter匹配的输出"test øæåØÆÅ"