Google App Engine/Java:希伯来文存储正常但检索显示问号问题
解决希伯来文检索时变为问号的问题
嘿,我来帮你搞定这个希伯来文变问号的问题!这种情况大多是字符编码在数据检索或响应输出环节没正确设置UTF-8导致的——毕竟存储的时候没问题,说明写入环节是OK的,咱们从这几个方向排查修复:
1. 先把请求解析的编码锁死在UTF-8
如果前端传参或者Spring解析请求时编码不对,后续的读取操作肯定会乱码。你可以给项目加个全局编码过滤器:
- 传统Spring项目在
web.xml里配置:<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> - 如果是Spring Boot项目,直接在
application.properties里加:server.servlet.encoding.force=true server.servlet.encoding.charset=UTF-8 server.servlet.encoding.enabled=true
2. 检查数据库连接的编码参数
存储正常不代表读取也没问题,数据库连接如果没指定UTF-8,读取时会自动转成默认编码(比如ISO-8859-1),希伯来文就会变成问号。
- MySQL的JDBC URL要加编码参数:
jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=UTF-8 - PostgreSQL的话,确保连接参数里包含
client_encoding=UTF8。
3. 强化Spring响应的编码配置
你已经在@RequestMapping里加了produces="application/json;charset=UTF-8",这步很对,但可以再加个全局配置兜底,避免局部配置失效:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setDefaultCharset(StandardCharsets.UTF_8); converters.add(converter); } }
这样所有JSON响应都会强制用UTF-8编码,不会出现字符丢失的情况。
4. 避免手动转码的坑
从数据库读取希伯来文后,别瞎折腾转码操作——比如new String(str.getBytes(), "UTF-8")这种操作反而会破坏原有编码。如果数据库连接和请求编码都对了,直接返回字符串就行。
给你个修复后的示例代码参考:
@RequestMapping(value="/SomeAction.html", method = RequestMethod.POST, produces="application/json;charset=UTF-8") @ResponseBody public String getQuestion(HttpServletRequest request, HttpServletResponse response){ // 有了编码过滤器就不用手动设置request编码了 String qKey = request.getParameter("qKey"); // 从数据库读取内容(确保DAO层的连接编码是UTF-8) String hebrewContent = yourQuestionDao.getContentByKey(qKey); // 推荐用Jackson自动转JSON,比手动拼接更靠谱 ObjectMapper mapper = new ObjectMapper(); mapper.setDefaultCharset(StandardCharsets.UTF_8); return mapper.writeValueAsString(Map.of("question", hebrewContent)); }
总的来说,核心就是确保请求解析、数据库连接、响应输出三个环节全都是UTF-8编码,这样希伯来文就能正常读取和返回了。
内容的提问来源于stack exchange,提问作者Uri Lukach
相关产品推荐
相关产品推荐

