0

我正在尝试从 XML 提要中提取 £ 符号(完整版在这里 > http://mjsiphone.com/scotjobsnet/

迷你版在这里 > http://scotjobsnet.co.uk.ni.strategiesuk.net/testfeed.xml

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

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

此外,我必须删除所有 HTML(从职位描述中)并删除任何 HTML 编码字符并用它们的真实值替换它们。

因此,我需要在 MS SQL 2008 DB 中以 nvarchar 数据类型保存真正的 £ 符号,而不是 20,000 英镑或 20,000 英镑等。

查看提要的来源时,它的顶部有 UTF-8。

但是,在浏览器源中查看提要时,我没有看到将 UTF-8 作为请求/响应标头,在请求标头 (Chrome) 中我只看到:

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

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

如果您在浏览器中查看提要,英镑符号会显示得很好。

当我将内容输出到 Windows 命令控制台时,它们会显示为 £ 符号。

但是,当我尝试将它们保存到数据库或通过管道将控制台调试输出到 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 控制台中查看输出之前所说,£ 显示良好。

谢谢

4

1 回答 1

0

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

Console.WriteLine(Console.OutputEncoding);

这里有两种转码操作:

UTF-8 > UTF-16 string > console encoding

XML 规范中描述了检测 XML 文档编码的正确方法。XmlDocument将为您执行此操作。

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

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的信息

于 2014-06-12T08:13:16.343 回答