代码之家  ›  专栏  ›  技术社区  ›  Tim

为什么这会出现在我的c#字符串中:

  •  10
  • Tim  · 技术社区  · 17 年前

    string strVal = "£2000";
    

    但是,每当我写出这个字符串时,就会写出以下内容:

    美元不能做到这一点。

    我用来写出值的代码示例位:

    System.IO.File.AppendAllText(HttpContext.Current.Server.MapPath("/logging.txt"), strVal);
    

    我猜这与本地化有关,但如果c#string只是unicode,那么这肯定会起作用吗?

    再补充一点信息,Jon Skeet的答案是正确的,但是我在对字符串进行URL编码时也遇到了问题。有没有办法防止这种情况发生?

    %c2%a32000

    %a3=英镑

    还有什么想法吗?

    4 回复  |  直到 17 年前
        1
  •  7
  •   Jon Skeet    17 年前

    AppendAllText 正在用UTF-8写出文本。

    你用什么看它?很可能是不理解UTF-8,或者不先尝试UTF-8。告诉您的编辑器/查看器这是一个UTF-8文件,一切都应该正常。或者,使用 附录文本 它允许您指定编码并使用最方便的编码。

    编辑:在回答您编辑的问题时,使用ASCII编码失败的原因是ASCII字符集(Unicode 0-127)中没有该字符。

    HttpUtility.UrlEncode 接受编码的重载。

        2
  •  6
  •   Daniel Earwicker    17 年前

    在HTML页面和HTTP标头中使用时,URL的默认字符集称为 ISO-8859-1

    它不同于UTF-8,也不同于ASCII,但它适合每个字符一个字节。范围0到127非常类似于ASCII,整个范围0到255与Unicode的范围0000-00FF相同。

    因此,您可以通过将每个字符转换为一个字节,从C#字符串生成它,也可以使用 Encoding.GetEncoding("iso-8859-1")

    (在此字符集中,英国镑符号为163。)

    出身背景

    The RFC says

    该上下文由另外两个标准定义,HTTP和HTML,它们确实指定了默认字符集,并且共同对实现者产生了一种几乎不可抗拒的力量,即地址栏包含引用ISO-8859-1的百分比编码。

    ISO-8859-1 is the character set of text-based content sent via HTTP

    另一个因素是,HTML也使用ISO-8859-1作为其默认值,URL通常作为HTML页面中的链接发起。因此,当您在记事本中创建一个简单的最小HTML页面时,您在该文件中键入的URL位于ISO-8859-1中。

    因此,例如,关于 this page

    字符的URL编码包括 两位十六进制表示法 ISO拉丁语的(不区分大小写) 字符的代码点。

    (ISO拉丁语是is-8859-1的另一个名称)。

    理论到此为止。将其粘贴到记事本中,另存为.html文件,并在一些浏览器中打开。点击链接,谷歌应该搜索英国镑。

    <HTML>
      <BODY>
        <A href="http://www.google.com/search?q=%a3">Test</A>
      </BODY>
    </HTML>
    

    它可以在IE、Firefox、Apple Safari、Google Chrome中使用——我现在没有其他可用的。

        3
  •  0
  •   gimel    17 年前

    注意 %a3 无法在中编码 ASCII码 (7位, Basic Latin

    这个 Pound Sign (down the page) Latin-1

        4
  •  0
  •   Metodija Angjelkoski    10 年前

    我注意到只有在使用长字符串(超过4000个)字符时才会发生这种情况。我的解决方案是在接收到数据库中的参数后,简单地用零替换符号。

    推荐文章