Java 如何检测传递给Tomcat应用程序的无效UTF-8字符串?

Java 如何检测传递给Tomcat应用程序的无效UTF-8字符串?,java,tomcat,utf-8,Java,Tomcat,Utf 8,在测试一个新的web应用程序时,我碰巧将另一个浏览器窗口中的字符串剪切并粘贴到web应用程序的输入表单中。这个字符串中有一个特定的字符,一个单引号(字节值146,十六进制92)。您可以通过转到并查看公司名称来查看角色: Martin’s Auto Repair. 字符剪切和粘贴正确,但当我提交表单时,它被弄坏了: Martinâs Auto Repair 后续提交增加了损坏: MartinâÂÂs Auto Repair MartinâÃÂÃÂs Auto Repair MartinÃ

在测试一个新的web应用程序时,我碰巧将另一个浏览器窗口中的字符串剪切并粘贴到web应用程序的输入表单中。这个字符串中有一个特定的字符,一个单引号(字节值146,十六进制92)。您可以通过转到并查看公司名称来查看角色:

Martin’s Auto Repair.
字符剪切和粘贴正确,但当我提交表单时,它被弄坏了:

Martinâs Auto Repair
后续提交增加了损坏:

MartinâÂÂs Auto Repair
MartinâÃÂÃÂs Auto Repair
MartinÃÂâÃÂÃÂÃÂÃÂs Auto Repair
我的JSP页面、Tomcat服务器和我的应用程序都设置为使用UTF-8,因此它似乎试图将此字符作为UTF-8多字节字符的第一个字符来读取,并以某种方式将其弄乱

当然,我很想知道这其中的复杂性,但我更感兴趣的是阻止这种行为。


有人知道如何避免这种情况吗

真的,乔恩是对的。在处理链的某个地方,您没有正确处理unicode字符,需要更多信息。话虽如此,我只能想到tomcat上正常servlet/JSP流中需要检查的两个地方,因此我将尝试回答:

首先,检查您的tomcat配置。需要将的
URIEncoding
属性设置为
UTF-8
。有了这个集合,传递到servlet中的字符串应该被正确解码。您可能需要临时记录获得的值,以验证其是否正确

其次,检查JSP页面输出的字符编码。我相信JSP的默认编码应该处理unicode,但检查浏览器中的头/html也是值得的,因为这可能也是您的问题


这两种情况中的任何一种都可能导致您看到的问题。除非您或您正在使用的框架正在某处进行编码/解码,否则这应该可以解决您的问题。

“ASCII值146”不存在-ASCII是一种7位编码。了解您感兴趣的Unicode代码点、发送到服务器的字节数、浏览器指定的编码方式等都很重要。对不起,不管您想叫它什么,一个值为146的字节。我来自ASCII码时的“时代”,但它不是一个字节,而是一个字符。这就是重点。在我看来,好像您想要U+2019,它在UTF-8中表示为字节E28099。但您确实需要确定在流程的每个步骤中使用的是哪种编码,以及哪里出了问题。