前端解决返回的数据编码问题

背景

最近做项目需要调用后端的接口,返回的是服务器静态文本文件,而且这个文本文件是不同人的制作,放到服务器上的。这就导致了文件的编码格式不同。有的是utf-8,有的是gbk,按照一种格式去进行解码,会导致页面显示的内容乱码。如下图所示:

解决方法

发现查资料发现,上面的乱码字符是utf-8,在解析其他编码格式,无法正确的解码,就会使用替换字符进行填充。这样就想到了一个解决的办法,就是把从服务器上拿到的数据,先进行utf-8解码,然后,判断有替换字符,就说明使用的解码格式不正确,然后在换另一种解码格式。代码实现如下:

/**
 * 使用指定的字符编码将 Blob 对象解码为字符串。
 * @param {Blob} blob - 要解码的 Blob 对象。
 * @param {string} [code="utf-8"] - 用于解码的字符编码,默认是 "utf-8"。
 * @returns {Promise<string>} - 返回一个 Promise,解析为解码后的字符串,如果解码失败则拒绝并返回错误信息。
 */
function decode(blob, code = "utf-8") {
  return new Promise((resolve, reject) => {
    // 创建一个 FileReader 对象
    const reader = new FileReader();
    // 定义 load 事件处理程序
    reader.onload = () => {
      const decodedText = reader.result;
      // 检查解码后的字符串中是否包含替换字符(65533),表示解码错误
      let hasError = false;
      for (let i = 0; i < decodedText.length; i++) {
        if (decodedText.charCodeAt(i) === 65533) {
          hasError = true;
          break;
        }
      }
      // 根据解码结果解析或拒绝 Promise
      if (hasError) {
        reject("编码失败");
      } else {
        resolve(decodedText);
      }
    };
    // 定义 error 事件处理程序
    reader.onerror = () => reject("文件读取错误");
    // 将 Blob 读取为 ArrayBuffer
    reader.readAsText(blob, code);
  });
}

但是需要注意的是,从服务器上获得文件要把 responseType设置成blob,下面是axios的设置

 axios.get(文件地址", { responseType: "blob"})
正确的显示结果

 

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Java 中,可以通过多种方式将数据返回前端。下面是一些常用的方式: 1. 使用 Servlet API 可以使用 Servlet API 中的 `HttpServletResponse` 对象将数据返回前端。例如: ``` protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = "Hello, World!"; response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(data); } ``` 以上代码将一个字符串数据返回前端,使用了 `setContentType()` 方法设置了响应的内容类型,使用了 `setCharacterEncoding()` 方法设置了响应的字符编码,最后使用 `getWriter().write()` 方法将数据写入响应流中。 2. 使用 Spring MVC 如果使用了 Spring MVC 框架,则可以使用 `@ResponseBody` 注解将数据返回前端。例如: ``` @RestController public class MyController { @GetMapping("/data") public String getData() { return "Hello, World!"; } } ``` 以上代码使用了 `@RestController` 注解标识了一个控制器类,使用了 `@GetMapping("/data")` 注解标识了一个 GET 请求处理方法,最后使用了返回字符串的方式将数据返回前端。 3. 使用 JSON 格式返回数据 如果需要返回复杂的数据结构,可以使用 JSON 格式将数据返回前端。可以使用 Gson、Jackson 等库来将 Java 对象转换为 JSON 格式。例如: ``` @RestController public class MyController { @GetMapping("/data") public String getData() { Map<String, Object> resultMap = new HashMap<>(); resultMap.put("name", "张三"); resultMap.put("age", 20); return new Gson().toJson(resultMap); } } ``` 以上代码将一个 Map 对象转换为 JSON 格式,最后使用 `@ResponseBody` 注解将数据返回前端前端可以使用 Ajax 或其他方式获取到返回的 JSON 数据,并进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值