2013-09-24 34 views
-1

的字符串让我改一下我的问题:查找®文本

我在文本阅读,其中的人物之一是注册的符号,®,从具有显示符号没有问题的文本文件。当我从文件中读取字符串后尝试打印字符串时,该符号是不可打印的字符。当我读取字符串并将字符串拆分为字符并将字符转换为Int16并打印出十六进制数时,我得到0xFFFD。当我打开StreamReader时,我指定Encoding.UTF8

这里是我有什么

using (System.IO.StreamReader sr = new System.IO.StreamReader(HttpContext.Current.Server.MapPath("~/App_Code/Hormel") + "/nutrition_data.txt", System.Text.Encoding.UTF8)) 
{ 
    string line; 
    while((line = sr.ReadLine()) != null) 
    { 
     //after spliting the file on '~' 
     items[i] = scrubData(utf8.GetString(utf8.GetBytes(items[i].ToCharArray()))); 
     //items[i] = scrubData(items[i]); //original 
    } 
} 

这里是scrubData功能

private String scrubData(string data) 
     { 
      string newStr = String.Empty; 
      try 
      { 

       if (data.Contains("HORMEL")) 
       { 
        string[] s = data.Split(' '); 
        foreach(string str in s) 
        { 
         if (str.Contains("HORMEL")) 
         { 
          char[] ch = str.ToCharArray();        
          for(int i=0; i<ch.Length; i++) 
          { 
           EventLogProvider.LogInformation("LoadNutritionInfoTask", "Test", ch[i] + " = " + String.Format("{0:X}", Convert.ToInt16(ch[i]))); 
          } 
         } 
        } 
       } 
return String.Empty; 
      } 
      catch (Exception ex) 
      { 
       EventLogProvider.LogInformation("LoadNutritionInfoTask", "ScrubData", ex.Message); 
       return data; 
      } 
     } 

我不关心现在返回什么,我打印出来的字符和十六进制与它们相对应的代码。

+1

嗯......只要搜索“®”? – JDB

+1

如果你只是尝试一下,找出哪一个是对的,如果两者都是? – tnw

+0

@Cybȫʁgϟ37当我搜索“®”时,它与符号不匹配。 – DFord

回答

0

检查您正在解码字节的编码。

1

首先,您需要确保阅读的文字是correct encoding。在我看来,你使用UTF-8,因为你说®(Unicode代码点U + 00AE)是0xC2AE,这是the same as UTF-8。您可以使用这样的:

Encoding.UTF8.GetString(new byte[] { 0xc2, 0xae }) // "®", the registered symbol 
// or 
using (var streamReader = new StreamReader(file, Encoding.UTF8)) 

一旦你得到了它在C#中string,你应该使用HttpUtility.HtmlEncode将其编码为HTML。例如。

HttpUtility.HtmlEncode("SomeStuff®") // result is "SomeStuff&#174;" 
+0

为什么你需要编码'®'? – JDB

+0

@Cybȫʁgϟ37我不完全确定,我猜OP有足够的理由。在最终得到的HTML中,你最想编码像'HtmlEncode'那样的'<' and '>',这样你就不会打开注入漏洞(除非这是一个可信的.txt文件,的东西)。 –

0

试试这个:

 string txt = "textwithsymbol"; 
     string html = "<html></html>"; 
     txt = txt.Replace("\u00ae", html); 

很明显,你将与你在阅读和“\ u00ae转移”是你正在寻找的符号的文本替换成txt变量。