C# ISO-8859-1中的特殊字符
我正在用C#阅读HTML页面。请求类似firefox的页面。网站C# ISO-8859-1中的特殊字符,c#,iso-8859-1,C#,Iso 8859 1,我正在用C#阅读HTML页面。请求类似firefox的页面。网站charset=ISO-8859-1(我正在使用)。但是我不能设法得到‰。当我请求源代码时,我在它的位置上得到了?标记。其他特殊字符如é也可以。有什么建议吗?我该怎么办?字符不是ISO-8859-1编码的一部分,不能用它来表示 这可以通过以下代码片段轻松演示: public class Program { static void Main() { var input = "‰"; va
charset=ISO-8859-1
(我正在使用)。但是我不能设法得到‰
。当我请求源代码时,我在它的位置上得到了?
标记。其他特殊字符如é
也可以。有什么建议吗?我该怎么办?字符不是ISO-8859-1编码的一部分,不能用它来表示
这可以通过以下代码片段轻松演示:
public class Program
{
static void Main()
{
var input = "‰";
var encoding = Encoding.GetEncoding("iso-8859-1");
var buffer = encoding.GetBytes(input);
input = encoding.GetString(buffer);
// prints a ? because ISO-8859-1 cannot represent this character
Console.WriteLine(input);
}
}
因此,我想您必须使用一些其他编码,例如UTF-8,它允许表示此字符。如回复中其他地方所述,ISO 8859-1中没有每千符号
但是,您可以将is作为一个实体发送(
‰
)。由于HTML(如XML)的底层模型是Unicode,因此无法在文本编码中表示但使用Unicode的字符可以作为实体包含。字符':/
在ISO-8859-1中是而不是。然而,它通常与ISO-8859-1混淆
最好的解决方案是使用‰代码>如Richard所建议,和/或从ISO-8859-1更改为UTF-8
(也有可能切换到代码页1252(Windows-1252
),但有一个风险,它不适用于所有用户;在iso-8859-1中。你确定该站点发送的是8859而不是8859伪装下的其他东西吗?这是U+2030,iso-8859-1不支持的标志符号@MarcB它不在iso-8859-1中,但在iso-8859-1的MS扩展中:。在ISO-8859-1中,代码127–159(含)未定义。@Richard thnx,你救了我一天。需要使用扩展名^^^,但是我没有像和这样的特殊字符others@Buar:您需要确保所有内容都与编码一致。您没有为服务器端或客户端提供任何代码,因此很难显示发生了什么。Thnx Richard已经在评论中告诉我了。我已经解决了我的问题^^
public static string stringToISO8859str(string textToConvert)
{
Encoding iso8859 = Encoding.GetEncoding("iso-8859-1");
Encoding unicode = Encoding.Unicode;
byte[] srcTextBytes = iso8859.GetBytes(textToConvert);
byte[] destTextBytes = Encoding.Convert(iso8859, unicode, srcTextBytes);
char[] destChars = new char[unicode.GetCharCount(destTextBytes, 0, destTextBytes.Length)];
unicode.GetChars(destTextBytes, 0, destTextBytes.Length, destChars, 0);
StringBuilder result = new StringBuilder(textToConvert.Length + (int)(textToConvert.Length * 0.1));
foreach (char c in destChars)
{
int value = Convert.ToInt32(c);
if (value == 34)
result.AppendFormat(""");
else if (value == 38)
result.AppendFormat("&");
else if (value == 39)
result.AppendFormat("'");
else if (value == 60)
result.AppendFormat("<");
else if (value == 62)
result.AppendFormat(">");
else
result.Append(c);
}
return result.ToString();
}