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

时间:2009-03-30 10:07:23

标签: c# .net asp.net localization string

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

string strVal = "£2000";

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

一个£2000

美元不会这样做。

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

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

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

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

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

“%C2%a32000”

%c2 =Â %a3 =£

如果我编码为ASCII,则£出现为?

还有什么想法?

3 个答案:

答案 0 :(得分:7)

AppendAllText正在写出UTF-8中的文字。

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

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

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

答案 1 :(得分: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。)

<强>背景

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

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

除非另有说明,否则

ISO-8859-1 is the character set of text-based content sent via HTTP。因此,当URL字符串出现在HTTP GET标头中时,它应该在ISO-8859-1中。

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

标准中有时会将其描述为“漏洞”,但事实并非如此;只是HTML / HTTP填写了RFC for URL留下的空白。

因此,例如,关于this page的建议:

  

字符的URL编码包含   一个“%”符号,然后是   两位十六进制表示   (不区分大小写)ISO-Latin   角色的代码点。

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

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

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

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

答案 2 :(得分:0)

请注意,%a3无法以 ASCII (7位,Basic Latin)进行编码。

Pound Sign (down the page)Latin-1编码的一部分。