您的屏幕截图表明您的搜索关键字 bäck 作为 URL 的一部分作为 URL 参数发送。它还表明这项工作似乎正确地采用了 UTF-8 URL 编码。您在调试器中返回的字符串是典型的 UTF-8 编码字节的 ISO-Latin 解码:例如HTTPServletRequest 解析器使用 ISO-Latin 解析 UTF-8 编码的字符串。
因此,您的 ServletFilter 对解释它没有任何帮助:
request.setCharacterEncoding(this.encoding);
response.setCharacterEncoding(this.encoding);
因为正如 javadoc 所说:这些方法适用于 HTTP 请求的正文,而不是其 URL。
/**
* Overrides the name of the character encoding used in the body of this
* request. This method must be called prior to reading request parameters
* or reading input using getReader(). Otherwise, it has no effect.
*
查看 URL 参数解析是 Servlet 容器的职责,您应该查看的设置可能是容器级别的设置。 例如,在 Tomcat 上,如文档中所述: http://tomcat.apache.org/tomcat-7.0-doc/config/http.html :
URIEncoding :指定在 %xx 解码 URL 后用于解码 URI 字节的字符编码。如果未指定,将使用 ISO-8859-1。
默认情况下,它使用 ISO-8859-1。您应该将其更改为 UTF-8,然后,您的请求参数将从 servlet 容器中正确解析,并传递给 HTTPServletRequest 对象。
编辑:当您看到浏览器行为不一致时,您可以检查 HTML 表单的一致性。请确保
问题:如果服务部署在docker容器中,如何处理瑞典字符。
按照以下步骤处理瑞典字符:
请求映射中的端点使用以下属性
produces = {"application/json;charset=UTF-8", "application/json;charset=UTF-8"}
在 application.properties 中插入以下行
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
运行 apt-get -y 安装语言环境
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
locale-gen
ENV LANG en_US.UTF-8
ENV 语言 en_US:en
ENV LC_ALL en_US.UTF-8
导入java.util.Locale;
Locale locale = new Locale.Builder().setLanguage("sv").setRegion("SE").build();
Locale.setDefault(区域设置)