Spring I18n中文、印地文显示问号问题求助
解决Spring I18n中文/印地文字符显示为问号的问题
嘿,我之前在做Spring国际化的时候也踩过这个字符显示成问号的坑!结合你给出的dispatcher-servlet.xml配置,咱们可以从这几个常见方向排查解决:
1. 先确认国际化资源文件的编码格式
你已经在messageSource里设置了defaultEncoding="UTF-8",但如果你的.properties文件本身不是以UTF-8编码保存的,这配置就起不到作用。
- 打开你的
messages_zh_CN.properties、messages_hi_IN.properties等文件,检查它们的保存编码(比如IDEA右下角会显示当前文件编码,若不是UTF-8,直接转换成UTF-8即可)。 - 小提示:如果你的资源文件里是Unicode转义字符(比如
\u4F60\u597D这种形式),其实也能正常显示,但如果是直接写中文/印地语字符,必须保证文件编码是UTF-8。
2. 给MessageSource显式指定文件编码
有时候仅靠defaultEncoding可能不够,你可以给ReloadableResourceBundleMessageSource添加fileEncodings属性,明确指定每个资源文件的编码:
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="classpath:messages" /> <property name="defaultEncoding" value="UTF-8" /> <!-- 为各个语言资源文件指定UTF-8编码 --> <property name="fileEncodings"> <props> <prop key="classpath:messages">UTF-8</prop> <prop key="classpath:messages_zh_CN">UTF-8</prop> <prop key="classpath:messages_hi_IN">UTF-8</prop> </props> </property> <property name="useCodeAsDefaultMessage" value="true" /> </bean>
3. 确保视图层的编码正确
如果你的项目用JSP作为视图,一定要在JSP页面顶部设置正确的编码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
另外,Spring的视图解析器也要配置编码,比如InternalResourceViewResolver:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> <property name="contentType" value="text/html;charset=UTF-8" /> </bean>
4. 检查Web容器的编码配置
如果你用的是Tomcat,需要修改server.xml里的Connector节点,添加编码相关配置,避免请求/响应过程中字符被转码:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI="true"/>
5. 补全LocaleResolver的配置
你提供的配置里localeResolver没写完,确保它的配置是正确的,比如用SessionLocaleResolver,并搭配LocaleChangeInterceptor来支持语言切换:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> <property name="defaultLocale" value="en" /> </bean> <!-- 添加拦截器,允许通过?lang=zh_CN这样的参数切换语言 --> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <property name="paramName" value="lang" /> </bean> </mvc:interceptors>
建议先从资源文件编码开始排查,这是最常见的问题根源,然后依次检查其他配置,应该就能解决字符显示为问号的问题了!
内容的提问来源于stack exchange,提问作者kavya




