有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JSP解码字符串不等于普通字符串

我是新手,所以请耐心点。。。 我发现了一个JSP代码片段,它从标题信息中读取用户数据,并对其进行了一点更改(使其成为一个函数)。问题是,返回的字符串只是比较好:我做了家庭作业,意识到这一定是某种字符集问题,因为即使两个字符串长度不匹配,但我找不到解决方案。如何将它们转换为适当的格式

<%@ page import="sun.misc.BASE64Encoder" %>
<%@ page import="java.io.*" %>
<%!
public String matchuser(String inputUser,HttpServletRequest request,HttpServletResponse response) throws java.io.IOException
{  

  String auth = request.getHeader("Authorization");
  String s = "";
  String retval = "kakukk";

  //no auth, request NTLM
  if (auth == null) {
          response.setStatus(response.SC_UNAUTHORIZED);
          response.setHeader("WWW-Authenticate", "NTLM");
          return "no auth";
  }
  //check what client sent
  if (auth.startsWith("NTLM ")) { 
          //System.out.println(auth);  

          byte[] msg = new sun.misc.BASE64Decoder().decodeBuffer(auth.substring(5));
          int off = 0, length, offset;              

          //############################

          if (msg[8] == 1) 
          { 
              off = 18;

              byte z = 0;
              byte[] msg1 =
                  {(byte)'N', (byte)'T', (byte)'L', (byte)'M', (byte)'S',(byte)'S', (byte)'P', 
                  z,(byte)2, z, z, z, z, z, z, z,
                  (byte)40, z, z, z, (byte)1, (byte)130, z, z,
                  z, (byte)2, (byte)2, (byte)2, z, z, z, z, // 
                  z, z, z, z, z, z, z, z};
              // send ntlm type2 msg

              response.setStatus(response.SC_UNAUTHORIZED);
              response.setHeader("WWW-Authenticate", "NTLM " 
                 + new sun.misc.BASE64Encoder().encodeBuffer(msg1).trim());

                 return "dunno msg[8]";
          } 
          else if (msg[8] == 3) 
          { 
                  off = 30;
                  length = msg[off+17]*256 + msg[off+16];
                  offset = msg[off+19]*256 + msg[off+8];
                  s = new String(msg, offset, length);
                  // print computer name // out.println(s + " ");
          }
          else
          {
            return "done";
          }

          length = msg[off+9]*256 + msg[off+8];
          offset = msg[off+11]*256 + msg[off+10];

          //############################  
          s = new String(msg, offset, length);

          if(s.equals(inputUser))
          {
            return "match";
          }
          else
          {
            return "not match:-" + s + "- input:-" + inputUser+"-";
          }               
  } 
  return "final";        
}         
%>

<%
String fnc = matchuser("u099511",request,response);

out.println(fnc);

%>

在最后几行中,我使用我的用户(u099511)调用函数。从表面上看,这两个字符串看起来是一样的,但它们不是,我无法比较它们:

not match:-u099511- input:-u099511- 

我错过了什么? 非常感谢您的帮助


共 (1) 个答案

  1. # 1 楼答案

    好的,问题是返回的字符串是UTF16LE。不要问为什么,显然我们的服务管理系统使用这个。。。 无论如何,解决方案是将结果字符串声明为utf16le:

    s = new String(msg, offset, length, "UTF-16LE");
    

    如果你像我一样是一个初学者,你可能想记住UTF16在默认情况下是UTF-16BE