Http Encoding.ASCII VS Encoding.UTF8错误

Http Encoding.ASCII VS Encoding.UTF8错误,http,unicode,utf-8,ascii,utf-16,Http,Unicode,Utf 8,Ascii,Utf 16,世界!我正在使用.Net Framework 4System.Net.Sockets.TcpClient编写简单的HTML服务器 我在StringBuilder HTML中有HTML,其中包含一些文本。例如: <div id="RequestText"> GET / HTTP/1.1<br/>Host: localhost:90<br/>Connection: keep-alive<br/>Cache-Control: max-age=0

世界!我正在使用.Net Framework 4System.Net.Sockets.TcpClient编写简单的HTML服务器

我在StringBuilder HTML中有HTML,其中包含一些文本。例如:

<div id="RequestText">

    GET / HTTP/1.1<br/>Host: localhost:90<br/>Connection: keep-alive<br/>Cache-Control: max-age=0<br/>User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11<br/>Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<br/>Accept-Encoding: gzip,deflate,sdch<br/>Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4<br/>Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3

</div>

我使用Google Chrome,在使用编码的情况下,一些部分在显示页面的文本中丢失。UTF8。结尾“indows-1251,utf-8;q=0.7,*;q=0.3”被截断。丢失部分后的HTML文本的其余部分仍然存在。如果我使用编码.ASCII,一切正常。对原因有什么想法吗?

只是猜测一下。。。但也许UTF-8编码使用的字节数比ASCII编码的多(可能有些字符是以双字节的方式编码的,而ASCII只是使用?或类似的方式),因此消息的最大长度被超过了?

根据您显示的有限代码,这只是一个猜测,但是您使用
html.Length.ToString()
向我表明,您的
\htmlHeader
变量包含以
Content Length
头结尾的HTTP头,而
html.Length.ToString()
正用于完成该头。如果这是真的,那么您向客户机发送了错误的
长度
值,因此它最终从其一端的套接字读取了错误的字节数。
Content Length
标题指定要发送的字节数。您正在将
内容长度设置为StringBuilder
中的UTF-16编码字符数,而您应该将其设置为发送的UTF-8编码字节数

试试这个:

private static void SendResponseToClient(NetworkStream clientStream, StringBuilder html)
{
    Byte[] html_buffer = Encoding.UTF8.GetBytes(html.ToString());

    // HTTP does not support non-ASCII characters in headers.
    Byte[] http_buffer = Encoding.ASCII.GetBytes(_htmlHeader + html_buffer.Length.ToString() + "\n\n");

    clientStream.Write(http_buffer, 0, http_buffer.Length);
    clientStream.Write(html_buffer, 0, html_buffer.Length);
}

当然,还要确保
\u htmlHeader
包含
内容类型:text/html;charset=utf-8
头,以确保客户端正确处理utf-8编码的HTML。

如果我理解正确,在这种情况下,消息的其余部分应该全部丢失,但在我的情况下,其余文本仍然存在。哦,我明白了。。。我知道文字会被剪得很厉害!希望这有帮助。我明天试试,然后写下结果。非常感谢你,雷米!你帮了我很多!这很有效!:)不幸的是,“投票需要15个声望”。很抱歉
private static void SendResponseToClient(NetworkStream clientStream, StringBuilder html)
{
    Byte[] html_buffer = Encoding.UTF8.GetBytes(html.ToString());

    // HTTP does not support non-ASCII characters in headers.
    Byte[] http_buffer = Encoding.ASCII.GetBytes(_htmlHeader + html_buffer.Length.ToString() + "\n\n");

    clientStream.Write(http_buffer, 0, http_buffer.Length);
    clientStream.Write(html_buffer, 0, html_buffer.Length);
}