2013-09-24 64 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變量。