我正在使用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。
非常感谢任何帮助和点击。
干杯
答案 0 :(得分:1)
任何系统处理XML都应该能够处理UTF-8字符集,尤其是在编码显式声明为UTF-8的情况下。这些字符不应该被编码为数字实体引用。
如果要确保使用数字实体序列化这些字符,请将编码设置为较小的字符集,例如ascii
或us-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 øæåØÆÅ"
。