【问题标题】:Finding ® in a string of text在文本字符串中查找 ®
【发布时间】:2013-09-24 20:36:17
【问题描述】:

让我重新表述我的问题:

我正在从一个显示符号没有问题的文本文件中读取其中一个字符是注册符号 ® 的文本。当我从文件中读取字符串后尝试打印字符串时,该符号是不可打印的字符。当我读入字符串并将字符串拆分为字符并将字符转换为 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;
            }
        }

我不关心现在返回的内容,我正在打印对应的字符和十六进制代码。

【问题讨论】:

  • 嗯...只要搜索“®”?
  • 你试一试,看看哪个是对的,如果有的话,怎么样?
  • @Cybȫʁgϟ37 当我搜索“®”时,它与符号不匹配。
  • @DFord 那么符号不存在。这可能是因为您在读取文件时使用了不正确的编码
  • 所以这确实是一个关于为什么您尝试查找“®”没有成功的问题。在这种情况下,您真的应该向我们展示SSCCE。然后,我们可以就您可能做错的地方向您提供建议。

标签: c# asp.net string text


【解决方案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;"

【讨论】:

  • @Cybȫʁgϟ37 我不完全确定,我猜 OP 有充分的理由。在生成的 HTML 中,您很可能希望对 &lt;&gt; 之类的内容进行编码,HtmlEncode 会这样做,这样您就不会打开注入漏洞(除非这是一个受信任的 .txt 文件)拥有那种东西)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    试试这个:

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

    显然你会用你读过的文本替换 txt 变量,“\u00ae”就是你要找的符号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 2016-11-14
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多