首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Encoding.ASCII对Encoding.UTF8 Bug

Encoding.ASCII对Encoding.UTF8 Bug
EN

Stack Overflow用户
提问于 2012-09-14 08:49:06
回答 2查看 2K关注 0票数 1

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

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

代码语言:javascript
复制
<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>

文本可以是多种多样的。当我向客户发送响应时

代码语言:javascript
复制
private static void SendResponseToClient(NetworkStream clientStream, StringBuilder html)
    {
        String data = _htmlHeader + html.Length.ToString() + "\n\n" + html; // The "data" is OK!
        Byte[] buffer;
        buffer = Encoding.UTF8.GetBytes(data); // !UTF8
        clientStream.Write(buffer, 0, buffer.Length);
    }

我使用Google,在显示页面的文本中丢失了一些部件,以防使用Encoding.UTF8.结尾“indows 1251,utf-8;q=0.7,*;q=0.3”被剪掉.丢失部分后的HTML文本的其余部分仍然处于位置。如果我使用Encoding.ASCII,,一切都好。理由的任何想法

EN

回答 2

Stack Overflow用户

发布于 2012-09-15 01:23:42

基于您所展示的有限代码,这只是猜测,但是您使用html.Length.ToString()向我建议您的_htmlHeader变量包含以Content-Length头结尾的header,而html.Length.ToString()用于完成该标头。如果这是真的,那么您将向客户端发送错误的Length值,因此它最终会从其端的套接字读取错误的字节数。Content-Length标头指定要发送的字节数。您正在将Content-Length设置为,将StringBuilder中的UTF-16编码字符的数量设置为,而要将UTF-8编码字节的数量设置为。

试试这个:

代码语言:javascript
复制
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);
}

当然,确保_htmlHeader包括一个Content-Type: text/html; charset=utf-8头,以确保客户端正确地处理UTF-8编码的HTML。

票数 3
EN

Stack Overflow用户

发布于 2012-09-14 08:54:19

只是猜测..。但是,也许UTF-8编码比ASCII使用更多的字节来编码文本(可能有些字符是以两字节的方式编码的,而ASCII只是使用一个?)或者对他们来说是这样的),这样信息的最大长度就被超越了?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12421022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档