模切字符-来自XML的磅符号

模切字符-来自XML的磅符号,xml,encoding,utf-8,character-encoding,mojibake,Xml,Encoding,Utf 8,Character Encoding,Mojibake,我正在尝试从XML提要中提取符号完整版本在这里> 这里有一个迷你版> 我无法控制提要的源或源服务器,也无法控制提要的格式、它们使用的头等等 我只需要构建一个.NET4.5控制台应用程序,它将提取数据并将其保存在我们自己的站点数据库中 此外,我还必须从工作描述中删除所有HTML,删除任何HTML编码的字符,并用它们的真实值替换它们 因此,我需要在MS SQL 2008数据库中保存nvarchar数据类型中的实际符号,而不是20000英镑或20000英镑等 查看提要源时,其顶部有UTF-8 但是,在

我正在尝试从XML提要中提取符号完整版本在这里>

这里有一个迷你版>

我无法控制提要的源或源服务器,也无法控制提要的格式、它们使用的头等等

我只需要构建一个.NET4.5控制台应用程序,它将提取数据并将其保存在我们自己的站点数据库中

此外,我还必须从工作描述中删除所有HTML,删除任何HTML编码的字符,并用它们的真实值替换它们

因此,我需要在MS SQL 2008数据库中保存nvarchar数据类型中的实际符号,而不是20000英镑或20000英镑等

查看提要源时,其顶部有UTF-8

但是,在浏览器源中查看提要时,我没有看到任何提及UTF-8作为请求/响应头的内容,在请求头中,我只看到:

接受语言:英语GB,英语US;q=0.8,en;q=0.6

当我将浏览器或控制台中的字符复制粘贴到SQL中并检查它们时,它们返回163,这是正确的ASCII字符编码,例如:

如果您在浏览器中查看提要,则磅符号显示良好

当我通过管道将内容发送到Windows命令控制台时,它们会显示为符号

但是,当我尝试将它们保存到DB或将控制台调试输出到EditPlus中的文件,并将字符编码设置为UTF8或ASCII时,我只会在数字前面得到正方形,而不是符号,例如CMD

[指向.exe的路径]>[指向debug.log文件的路径]

要么控制台无法通过管道将内容正确地传递到编辑器,要么我需要使用正确的编码,或者传递更多的标题,或者以不同的方式提取XML

下面是一个我用来测试的代码示例,只使用一个使用符号的字段,然后中断

static void Main(string[] args)
{           

    Console.WriteLine("START");

    XmlDocument xDoc = new XmlDocument();
    string feedURL = "http://scotjobsnet.co.uk.ni.strategiesuk.net/testfeed.xml";

    WebClient webClient = new WebClient();
    // need to pass a user-agent > 10 Chars to prevent blocking by OUR servers 403
    webClient.Headers.Add("user-agent", "Mozilla/5.0 (compatible; Job Feed Importer;)");

    // piping out to console with this line below shows a £ but to a UTF-8 or ASCII file it's gibberish
    webClient.Headers.Add("Content-Type", "application/xml; charset=utf-8");

    // I tried this but still the console works but piping to an editor in UTF-8 or ASCII shows squares
    webClient.Headers.Add("Accept-Language", "utf-8,en-GB,en-US;q=0.8,en;q=0.6");

    // download as text - is this the problem? Should I be using a different method
    string feedText = webClient.DownloadString(feedURL);

    // load into XML object
    xDoc.LoadXml(feedText);

    if (xDoc != null)
    {
        XmlElement root = xDoc.DocumentElement;
        XmlNodeList xNodelst = root.SelectNodes("job");
        foreach (XmlNode node in xNodelst)
        {
            string salary = node.SelectSingleNode("candidateSalary").InnerText;

            // piped to cmd console the £ signs show but to a UTF-8 file they are just squares
            // I've tried adding the Encoding.UTF8 or Encoding.ASCII still no joy
            // Console.WriteLine("candidateSalary = " + salary,Encoding.UTF8);
            Console.WriteLine("candidateSalary = " + salary);

            break;
        }
    }

    Console.WriteLine("FINISH");
}
任何帮助都将不胜感激

我确信这只是我需要传递的一个标题,或者可能是将XML内容输出到编辑器的问题

正如我之前所说,在Windows控制台中查看输出时,屏幕显示良好


谢谢

我希望此命令的输出不是UTF-8:

Console.WriteLine(Console.OutputEncoding);
这里有两种转码操作:

UTF-8 > UTF-16 string > console encoding
描述了检测XML文档编码的正确方法。XmlDocument将为您完成此操作

控制台编码可以设置为UTF-8,也可以将编码的字节序列化为直接

Console.OutputEncoding = System.Text.Encoding.UTF8;
XmlDocument xDoc = new XmlDocument();
string feedURL = "http://scotjobsnet.co.uk.ni.strategiesuk.net/testfeed.xml";
WebClient client = new WebClient();
client.Headers.Add("user-agent", "Mozilla/5.0 (compatible; Job Feed Importer;)");
byte[] feed = client.DownloadData(feedURL);
xDoc.Load(new MemoryStream(feed));
if (xDoc != null)
{
  XmlElement root = xDoc.DocumentElement;
  XmlNodeList xNodelst = root.SelectNodes("job");
  foreach (XmlNode node in xNodelst)
  {
    string salary = node.SelectSingleNode("candidateSalary").InnerText;
    Console.WriteLine("candidateSalary = " + salary);
    break;
  }
}

更多关于cmd.exe和Unicode的信息。

一些示例应该显示&163;等等,但是stackoverflow显然显示了编码字符,因为它在editor中不是双重编码的。注意application/xml是一种二进制MIME类型,您应该让一个xml解析器。不要信任cmd.exe。默认编码是20世纪80年代的旧DOS OEM代码页,默认的Windows字符编码通常是ANSI,也已过时。Console.WriteLine可能正在对字符串进行转码,这些字符串始终是UTF-16!到一些非UTF-8编码。另请参见CHCP命令。最后,£不在ASCII范围内。我只是将字符串替换为&163;然后将字符串放入XMLDocument中。然后将其装回插入件。那么你不是说我应该在某个地方传递额外的头或编码吗?这段代码使控制台在控制台中显示某种土耳其语/阿拉伯语字符,而不是磅符号,但在保存为UTF8的调试文件中,它现在确实显示磅符号。所以我想这就是我需要的。谢谢你的说法,只是将URL xDoc.Loadurl或字符串传递到xDoc.LoadXMLstring中不会处理编码?但是如果我使用一个内存流并向其中加载一个字节数组,那么它会检测到正确的编码吗?加载XML的许多其他答案与您展示的不同,它们使用WebClient.DownloadStringurl获取字符串,然后直接将其传递到XmlDocument对象,或者只将url传递到其中。我认为这是确保传递正确编码的正确方法>,如果在cmd.exe中键入CHCP,您可能会得到或类似的结果。在CP850中,是字节值9C。在UTF-8中,它是序列C2 A3。当cmd.exe将此UTF-8视为CP850时,它将打印┬ú. 如果控制台将字节解释为其他编码,您将得到不同的损坏。关于XML编码,使用带有URL的XmlDocument.Load是安全的。使用WebClient.DownloadString可能不安全。作为:下载资源后,该方法使用encoding属性中指定的编码将资源转换为字符串。这需要匹配文档编码。