http - 由于 Netty 服务器中的内容字符集设置,Firefox 中的像素无效

标签 http firefox character-encoding netty

我正在使用 Netty 开发一个 http 服务器。在某些情况下,服务器必须回答 1x1 透明像素。所以我在base64中硬编码了一个GIF透明像素,并用以下代码返回:

String pixel_string= new String (Base64.decodeBase64("R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="));
HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
response.setContent(ChannelBuffers.copiedBuffer(pixel_string, CharsetUtil.UTF_8));

编辑:我还设置了内容类型: response.setHeader(HttpHeaders.Names.CONTENT_TYPE, “图像/gif”); 在 Chrome 中,一切正常。但是,Firefox 告诉我它无法显示像素(这对我的应用程序来说非常糟糕),因为像素数据无效。 经过多次调查,我终于找到了解决办法,将字符集更改为 Iso-8859-1。

response.setContent(ChannelBuffers.copiedBuffer(
            responseBuilder.pixel_string, CharsetUtil.ISO_8859_1));

我不明白为什么会这样,这让我觉得在某些情况下我可能会遇到麻烦。我尝试更改 Firefox 首选项(将 UTF8 作为默认设置),但变化不大。

为什么 Firefox 接受 ISO-8859 编码,而不是 UTF-8?我可以更改它吗?有人会知道问题的根源以及如何确保它在任何用户设置下都能正常工作吗?

谢谢

最佳答案

接受或不接受编码与 Firefox 无关。这是您的服务器。

当您进行 base64 解码时,您会生成一个包含一些字符的字符串……但您真正生成的是字节,然后您会以某种方式将其视为字符。由于 Java String 是一个包含 UTF-16 字符串的容器,实际上您所做的是获取每个字节,将其视为 16 位整数并构建由这些代码单元组成的 UTF-16“字符串” .

但是当你想把所有这些都放在网络上时,你必须将字符串转换为字节,copiedBuffer 的参数说明了如何做到这一点。如果转换为 UTF-8,任何来自设置了高位的字节的字符最终将被编码为两字节的 UTF-8 序列。另一方面,如果转换为 ISO-8859-1,转换只会丢弃每个 UTF-16 代码单元的高字节(在您的情况下始终为零)。

所以转换为 ISO-8859-1 会产生你从 base64 解码中得到的实际字节数组,而转换为 UTF-8 会产生......其他可能有意义也可能没有意义的东西取决于确切的字节值。

关于http - 由于 Netty 服务器中的内容字符集设置,Firefox 中的像素无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15888035/

相关文章:

javascript - 是否可以使用 javascript 以编程方式在 Firefox 文件打开对话框中设置 "from:"字段

css - Google 字体 - CSS - 某些字符无法正常工作

css - @supports 不在 FF 和 Chrome 中使用

c - 字符串/正则表达式字符 '[' , ']' , '{' , '}' 在大型机 TN3270(代码页 1047,1147,500,249)上用 C 语言替换为空格

c# - 当我使用非共享运行时构建 Monodroid 项目时获取编码失败

java - 在锁定屏幕的情况下运行应用程序时,JobScheduler 作业无法启动

c - 在 WIndows 中使用 C 发送 HTTP GET 或 POST 请求

encoding - 经典的ASP字符编码

c# - Web api中的重复键问题

javascript - HTTP header 解析器