Java request.getRemoteUser()中的字符编码
每个请求都通过Microsoft IIS和一个连接到Tomcat的AJP13连接器发出。有些用户名包含德语特殊字符。如果用户名是“Kloß”,则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 =
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尝试了特殊字符。这根本不起作用。似乎是一个已知的问题,也许这会有所帮助?