【问题标题】:Data type to write ASCII 0-255 in Java (ServletOutputStream)在 Java 中写入 ASCII 0-255 的数据类型 (ServletOutputStream)
【发布时间】:2012-02-16 09:18:51
【问题描述】:

我有一个包含 0-255 值的数组“结果”。我最初将它声明为 byte[],但是当我必须写入 128 时,result[i] 的值是 -128,并且在输出文件中写入“€”,最终读取为 8364。

我可以看到字节只接受 -128 到 127 的值,我应该为 0-255 的值使用什么数据类型(不浪费内存)?

我是否也应该更改内容类型或添加任何字符集标题?

谢谢

res.setContentType("application/octet-stream"); 
res.setHeader("Content-Disposition","attachment;filename=output.js");
ServletOutputStream os = res.getOutputStream();
byte[] result=encode(req.getParameter("originalScript")); // Result[i]=-128 (should be 128)
os.write(result,0,result.length); // result[i] on output.js is written as "€" (8364)

【问题讨论】:

    标签: java servlets character-encoding bytearray outputstream


    【解决方案1】:

    你混淆了几个概念。

    首先,int 128 与 byte -128 相同(int 255 == byte -1, 254 == -2, ... 128 = -128)。字节是有符号的,符号信息在最高位。您的错误是您没有使用正确的方法将字节值转换回 int。要解决此问题,请使用以下代码:

    b = (byte) 128;
    int i = b & 0xff;
    System.out.println(b);
    System.out.println(i);
    

    给出-128128

    下一步:ASCII 仅定义为 0 到 127 之间的值。这意味着任何大于 127 的值都是垃圾,除非你仔细对待它。

    问题在于您阅读代码的输出。既然 ASCII 不能包含大于 127 的值,那么读码应该怎么做呢?

    “output.js”听起来就像您正在使用网络浏览器将这些数据作为 JavaScript 文件读取。 Web 浏览器将尝试使用“编码”将字节流转换为文本。你不指定一个,浏览器必须做出猜测并得到错误(application/octet-stream 似乎也错了。那不应该是text/javascript吗?)。

    你有两个选择:

    1. 更改 encode() 以返回正确编码的 UTF-8 字符串(UTF-8 是一种以字节形式发送 unicode 的方法)并将字符集设置为 UTF-8(这通常是默认值,但最好是安全而不是抱歉) :

      response.setHeader("Content-Type", "text/javascript; charset=UTF-8");
      
    2. 将字符集设置为ISO-8859-1,这将保留字节 1:1。如果您的脚本包含任何大于 255 的 Unicode 字符,这将失败。由于不会出现错误,您应该不要使用这种方法。我只是为了完整性而提及它。

    【讨论】:

      【解决方案2】:

      很难相信您的应用程序在当今时代对内存有如此严格的要求。

      无需进一步质疑您的动机,您可以这样做:

      byte[] result=encode(req.getParameter("originalScript"));
      char[] tmp = new char[result.length];
      for (int i = 0 ; i != result.length ; i++) {
          tmp[i] = (char)(result[i] & 0xFF);
      }
      os.print(new String(tmp));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        • 1970-01-01
        • 2012-08-25
        • 1970-01-01
        • 1970-01-01
        • 2013-04-04
        • 2020-06-26
        相关资源
        最近更新 更多