【问题标题】:Encoding.ASCII VS Encoding.UTF8 BugEncoding.ASCII VS Encoding.UTF8 错误
【发布时间】:2012-09-07 09:53:40
【问题描述】:

世界!我正在使用 .Net Framework 4 System.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>

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

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);
    }

我使用的是谷歌浏览器,如果使用 Encoding.UTF8,某些部分会在显示页面的文本中丢失。结尾“indows-1251,utf-8;q=0.7,*;q=0.3”被删减。丢失部分后的其余 HTML 文本仍然存在。如果我使用 Encoding.ASCII,一切正常。关于原因的任何想法?

【问题讨论】:

    标签: http unicode utf-8 ascii utf-16


    【解决方案1】:

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

    试试这个:

    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。

    【讨论】:

    • 谢谢!希望这可以帮助。我明天试试,写下结果。
    • 非常感谢,雷米!你帮了我很多!这行得通! :)
    • 不幸的是“投票需要 15 声望”。对不起。
    【解决方案2】:

    只是猜测...但也许 UTF-8 编码使用比 ASCII 更多的字节来编码您的文本(可能某些字符以两字节的方式编码,而 ASCII 只使用 ? 或类似的东西)和因此超过了消息的最大长度?

    【讨论】:

    • 如果我理解正确,在这种情况下,消息的整个其余部分都应该丢失,但在我的情况下,其余文本仍然存在。
    • 哦,我明白了...我知道文本会被整个剪掉
    猜你喜欢
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2022-10-31
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 2018-10-06
    相关资源
    最近更新 更多