【问题标题】:Encoding conversion of a fetch response获取响应的编码转换
【发布时间】:2016-12-31 22:58:47
【问题描述】:

在 React Native 方法中,我正在获取以 ISO-8859-1 编码的 xml。

只要完成提取,我就会尝试将其转换为 UTF-8。

这里是代码:

const iconv = require('iconv-lite');

fetch('http://www.band.uol.com.br/rss/colunista_64.xml', {
      headers: {
        "Content-type": "text/xml; charset=ISO-8859-1"
      }
})
.then(res=>res.text()})
.then(text => {
   const decodedText = iconv.decode(Buffer.from(text, 'latin1'), 'latin1')
  , output = iconv.encode(decodedText, 'utf8')
   console.log(output.toString())
})

问题是:正文的所有特殊字符都被替换为“¿½”

对于转换,我使用的是包iconv-lite

对于这个问题有什么更好的解决方法?

【问题讨论】:

    标签: xml encoding react-native fetch iconv


    【解决方案1】:

    最好的解决方法是使用res.arrayBuffer() 而不是res.text(),只要Buffer 构造函数接受ArrayBuffer

    代码:

    fetch('http://www.band.uol.com.br/rss/colunista_64.xml')
          .then(res => res.arrayBuffer())
          .then(arrayBuffer => iconv.decode(new Buffer(arrayBuffer), 'iso-8859-1').toString())
          .then(converted => console.log(converted))
    

    【讨论】:

    • 你测试过这个吗?我收到一条错误消息,说 arrayBuffer() 在 react-native 中没有实现
    • 非常正确;这不适用于 react-native;你可以通过导入 bufferstreamiconv-lite 包使 iconv 在 React.js 上工作,但 arrayBuffer() 仍然无法工作。
    • 这是一个丑陋的问题,有一个更丑陋的解决方法:您需要安装iconv-lite,加上它的依赖项,然后执行monkey punch listed this issue,因为无论出于何种原因,React Native 都没有支持arrayBuffer(),然后实例化一个Uint8Array 传递ArrayBuffer 作为参数,因为iconv-lite 将无法直接使用它。
    【解决方案2】:

    正如 Hellon Canella Machado 所指出的,您不能使用 res.text(),而必须使用 ArrayBuffer 作为解决方法。

    由于 res.arrayBuffer() 不适用于 React Native 中的 fetch,因此您可以使用 XMLHttpRequest API

    import iconv from 'iconv-lite';
    import { Buffer } from 'buffer';
    
    function fetchXML() {
      return new Promise((resolve, reject) => {
        const request = new XMLHttpRequest();
    
        request.onload = () => {
          if (request.status === 200) {
            resolve(iconv.decode(Buffer.from(request.response), 'iso-8859-1'));
          } else {
            reject(new Error(request.statusText));
          }
        };
        request.onerror = () => reject(new Error(request.statusText));
        request.responseType = 'arraybuffer';
    
        request.open('GET', 'http://www.band.uol.com.br/rss/colunista_64.xml');
        request.setRequestHeader('Content-type', 'text/xml; charset=ISO-8859-1');
        request.send();
      });
    }
    
    fetchXML().then(response => 
        console.log(response)
    );
    

    还要确保您已安装包 bufferstream

    【讨论】:

      【解决方案3】:
      let axiosConfig = {
          responseType: 'arraybuffer',
          responseEncoding: 'binary',
        }
      
      const htmlPage = await axios.get(`http://www.band.uol.com.br/rss/colunista_64.xml`, axiosConfig);
      const decoder = new TextDecoder('iso-8859-1');
      decoder.decode(pageHtml.data)
      

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      • 欢迎来到 Stack Overflow,感谢您提供答案。您能否编辑您的答案以包括对您的代码的解释?这将帮助未来的读者更好地理解正在发生的事情,尤其是那些不熟悉该语言并努力理解这些概念的社区成员。当几年前已经有一个已被社区验证的公认答案时,这一点尤其重要。在什么条件下您的方法可能更受欢迎?您是否在利用新功能?
      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2017-05-18
      • 2021-06-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 2020-04-23
      • 1970-01-01
      相关资源
      最近更新 更多