You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:21:37