Http Encoding.ASCII VS Encoding.UTF8错误
世界!我正在使用.Net Framework 4System.Net.Sockets.TcpClient编写简单的HTML服务器 我在StringBuilder HTML中有HTML,其中包含一些文本。例如: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
<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);
}