代码两行写尽情思 2025-04-19 14:29 采纳率: 0%
浏览 335

Flux<String>返回数据中文变成了问号

问题

当我在spring mvc项目中使用Flux对接口进行返回时,出现中文变成问号的情况,以下是我的代码

@GetMapping(value = "/chat", produces = "text/event-stream; charset=UTF-8")
public Flux<String> chat(@RequestParam String message, @RequestParam(required = false) String tag, HttpServletResponse response) {
    Flux<String> content = ragService.chat(message, tag)
            .filter(StringUtils::isNotBlank)
            .doOnNext(data -> log.info("Sending SSE data: [length={}, content={}]",
                    Objects.requireNonNull(data).length(), data))
            .doOnError(e -> log.error("SSE error: {}", e.getMessage()));
    return Flux.from(content);
}

通过调试发现,日志打印出来的数据是正常的中文,但是接口返回的数据却是

img

这种数据,英文和数字可以正常显示

试过的方案

方案一

在yaml中加入charts编码

server:
  servlet:
    encoding:
      charset: UTF-8
      force: true
      enabled: true

通过测试后发现无任何效果

方案二

在map中对数据进行编码


Flux<String> content = ragService.chat(message, tag)
            .filter(StringUtils::isNotBlank)
            .map(data -> URLDecoder.decode(data, StandardCharsets.UTF_8))
            .doOnNext(data -> log.info("Sending SSE data: [length={}, content={}]",
                    Objects.requireNonNull(data).length(), data))
            .doOnError(e -> log.error("SSE error: {}", e.getMessage()));
    return Flux.from(content);

经过测试发现无效

  • 写回答

4条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-04-19 14:35
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。
    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!

    Flux 返回数据中文乱码问题解决方案

    根据您描述的问题,当使用Flux返回SSE(Server-Sent Events)流时,中文显示为问号,而日志中显示正常。以下是几种可能的解决方案:

    解决方案1:确保响应头正确设置

    @GetMapping(value = "/chat", produces = "text/event-stream; charset=UTF-8")
    public Flux<String> chat(@RequestParam String message, @RequestParam(required = false) String tag, HttpServletResponse response) {
        // 显式设置响应头
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/event-stream;charset=UTF-8");
        
        Flux<String> content = ragService.chat(message, tag)
                .filter(StringUtils::isNotBlank)
                .doOnNext(data -> log.info("Sending SSE data: [length={}, content={}]",
                        Objects.requireNonNull(data).length(), data))
                .doOnError(e -> log.error("SSE error: {}", e.getMessage()));
        return Flux.from(content);
    }
    

    解决方案2:使用ResponseEntity包装

    @GetMapping(value = "/chat")
    public ResponseEntity<Flux<String>> chat(@RequestParam String message, @RequestParam(required = false) String tag) {
        Flux<String> content = ragService.chat(message, tag)
                .filter(StringUtils::isNotBlank)
                .doOnNext(data -> log.info("Sending SSE data: [length={}, content={}]",
                        Objects.requireNonNull(data).length(), data))
                .doOnError(e -> log.error("SSE error: {}", e.getMessage()));
        
        return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType("text/event-stream;charset=UTF-8"))
                .body(content);
    }
    

    解决方案3:检查客户端编码

    确保客户端(浏览器或其他消费者)也使用UTF-8编码接收数据。对于浏览器,可以检查:

    1. 请求头中是否包含 Accept-Charset: UTF-8
    2. 页面meta标签是否设置了 <meta charset="UTF-8">

    解决方案4:检查中间件配置

    如果使用了Nginx或其他反向代理,确保代理服务器不会修改编码:

    location / {
        proxy_set_header Accept-Encoding "";
        charset utf-8;
        # 其他配置...
    }
    

    注意事项

    1. 不要使用URLDecoder.decode(),因为您的数据不是URL编码的
    2. 确保您的源代码文件本身是UTF-8编码保存的
    3. 检查IDE/编辑器是否使用UTF-8编码处理文件

    如果以上方案都不能解决,可能需要检查更底层的网络传输或序列化配置。

    评论

报告相同问题?

问题事件

  • 修改了问题 4月19日
  • 修改了问题 4月19日
  • 创建了问题 4月19日