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

Tim*_*ers 10 .net c# asp.net string localization

我在c#初始化了一个字符串,如下所示:

string strVal = "£2000";
Run Code Online (Sandbox Code Playgroud)

但是每当我写出这个字符串时,都会写下:

2000£

它不会用美元做到这一点.

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

System.IO.File.AppendAllText(HttpContext.Current.Server.MapPath("/logging.txt"), strVal);
Run Code Online (Sandbox Code Playgroud)

我猜这与本地化有关,但如果c#字符串只是unicode肯定这应该有效吗?

澄清:更多信息,Jon Skeet的答案是正确的,但是当我URLncode字符串时我也遇到了问题.有没有办法阻止这种情况?

所以URL编码的字符串如下所示:

"%C2%a32000"

%c2 =Â%a3 =£

如果我编码为ASCII,那么£会出现?

还有什么想法吗?

Jon*_*eet 7

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

你用什么来看它呢?有可能是不了解UTF-8,或者不首先尝试UTF-8.告诉您的编辑/查看器它是一个UTF-8文件,一切都应该很好.或者,使用重载AppendAllText允许您指定编码并使用最方便的编码.

编辑:为了回答您编辑的问题,使用ASCII编码时失败的原因是£不是ASCII字符集(Unicode 0-127).

根据它的外观,URL编码也使用UTF-8.同样,如果要使用不同的编码,请将其指定为HttpUtility.UrlEncode接受编码的重载.


Dan*_*ker 6

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

它与UTF-8不同,它与ASCII不同,但它确实适合每个字符一个字节.0到127的范围很像ASCII,整个范围0到255与Unicode的范围0000-00FF相同.

因此,您可以通过将每个字符转换为字节来从C#字符串生成它,或者您可以使用Encoding.GetEncoding("iso-8859-1")获取对象来为您执行转换.

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

背景

RFC表示,未编码的文本必须限制在传统的7位US ASCII范围内,并且必须对其他任何内容(加上特殊的URL分隔符字符)进行编码.但它留下了用于8位范围上半部分的字符集的问题,使其依赖于URL出现的上下文.

并且该上下文由另外两个标准HTTP和HTML定义,这些标准确实指定了默认字符集,并且它们共同为实现者创建了一种实际上不可抗拒的力量,以假设地址栏包含引用ISO-8859-1的百分比编码.

ISO-8859-1 是通过HTTP发送的基于文本的内容的字符集,除非另有说明.因此,当URL字符串出现在HTTP GET标头中时,它应该在ISO-8859-1中.

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

它有时在标准中被描述为"洞",但事实并非如此; 只是HTML/HTTP填写了RFC为URL留下的空白.

因此,例如,此页面上的建议:

字符的URL编码由"%"符号组成,后跟字符的ISO-Latin代码点的两位十六进制表示(不区分大小写).

(ISO-Latin是IS-8859-1的另一个名称).

这个理论太多了.将其粘贴到记事本中,将其另存为.html文件,然后在几个浏览器中打开它.点击链接,谷歌应该搜索英镑.

<HTML>
  <BODY>
    <A href="http://www.google.com/search?q=%a3">Test</A>
  </BODY>
</HTML>
Run Code Online (Sandbox Code Playgroud)

它适用于IE,Firefox,Apple Safari,谷歌浏览器 - 我现在没有任何其他可用的.