Java request.getRemoteUser()中的字符编码

Java request.getRemoteUser()中的字符编码,java,tomcat,servlets,request,character-encoding,Java,Tomcat,Servlets,Request,Character Encoding,每个请求都通过Microsoft IIS和一个连接到Tomcat的AJP13连接器发出。有些用户名包含德语特殊字符。如果用户名是“Kloß”,则request.getRemoteUser()返回“Kloß?”。在Tomcats localhost_access_日志中,用户名正确记录为“Kloß” 如何将request.getRemoteUser()的返回值转换为UTF-8字符串 我试过但没有成功: String s1 = request.getRemoteUser() String s2 =

每个请求都通过Microsoft IIS和一个连接到Tomcat的AJP13连接器发出。有些用户名包含德语特殊字符。如果用户名是“Kloß”,则
request.getRemoteUser()
返回“Kloß?”。在Tomcats localhost_access_日志中,用户名正确记录为“Kloß”

如何将
request.getRemoteUser()
的返回值转换为UTF-8字符串

我试过但没有成功:

String s1 = request.getRemoteUser()
String s2 = org.apache.commons.codec.binary.StringUtils.newStringUtf8(request.getRemoteUser().getBytes())

我认为您需要找出
getRemoteUser()
编码产生的结果

在纯UTF-8系统上,我执行了以下操作:

    String name = "Kloß";
    System.out.printf("%x%n", new BigInteger(1, name.getBytes()));
哪个印刷品

    4b6c6fc39f
  /*K l o ß   */
c39f
输入到fileformat.info上的搜索中,我们发现它以utf-8十六进制表示


因此,使用您的
请求执行上面的printf.getRemoteUser()
,并尝试找出您的
ß
在哪个字符集中。如果请求来自windows计算机,我猜它是“CP1252”。

您是否尝试过
新字符串(s1.getBytes(),“utf-8”)?谢谢!我试过这个。结果与字符串S20中的结果相同访问日志编码是什么?我猜是ISO-8859-1。访问日志是UTF-8。“ß”编码为C3 9fThanks!我已经创建了一个新用户。名字是“äöüß”。您的上述代码在日志中打印了以下内容:“c3a4c3b6c3bcc33f”。c3a4=ä,c3b6=ö,c3bc=ü。这是UTF-8。但是c33f是什么?@PosNerd'c33f'不是一个字符,而是两个字符:
C3
=
3F
=
。这意味着在那个时候已经太晚了:有人已经转换了你的字符串。你得往上游搜索。可能会以某种方式注销IIS的输出?IIS和AJP1.3连接器工作正常。Tomcat在自己的本地主机访问日志中正确写入用户名。Tomcat内部的某些东西破坏了“ß”。我认为它并不打算支持用户名中的特殊字符。我用tomcatAuthentication和tomcat-users.xml尝试了特殊字符。这根本不起作用。似乎是一个已知的问题,也许这会有所帮助?