我在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,则£出现为?
还有什么想法?
答案 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)进行编码。