flutter解決下載html中文亂碼問題

目前的flutter版本貌似官方不支持gb23十二、gbk等gb系列字符集的解析,這裏要吐槽下!html

問題分析

通常咱們這麼來下載一個網頁的數據:java

http.Response response = await http.get(url);
String result = response.body;

這裏的response.body直接返回了字符串,那麼是怎麼作到的?咱們跟進去看下源碼:c++

/// [RFC 2616]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html
  String get body => _encodingForHeaders(headers).decode(bodyBytes);
Encoding _encodingForHeaders(Map<String, String> headers) =>
  encodingForCharset(_contentTypeForHeaders(headers).parameters['charset']);

這段代碼的意思是根據response的headers中的charset,找到一個合適encoding解碼器來進行解析git

Encoding encodingForCharset(String charset, [Encoding fallback = LATIN1]) {
  if (charset == null) return fallback;
  var encoding = Encoding.getByName(charset);
  return encoding == null ? fallback : encoding;
}

這裏最終是經過了Encoding.getByName這個方法獲取到了一個encoding,那麼看看flutter到底支持哪些字符集:github

好吧,我是沒有看到gb系列的字符集的影子,因此固然不能解析gbk等中文系列字符集了,那麼怎麼解決呢?編碼

解決方案

第一個想到的方案是其餘語言,好比java、c++等必定有解決方案,網上搜索了一下:url

c/c++採用編碼轉換表實現gbk與unicode互轉https://download.csdn.net/dow...spa

不依賴任何系統API,用c語言實現gbk/utf8/unicode編碼轉換https://blog.csdn.net/bladean....net

Unicode與UTF-8互轉(C語言實現)https://blog.csdn.net/tge7618...code

解決方法是:先將gbk轉成unicode,這個經過查表來實現,而後將unicode轉成utf-8,這個解決方案其餘語言都有現成的,dart沒有,只好造個輪子:

https://github.com/jzoom/gbk2...

使用方法也很簡單:

import 'package:gbk2utf8/gbk2utf8.dart';
 
 ...

 http.Response response = await http.get(url);
 String str = decodeGbk ( response.bodyBytes );

若有疑問,請加qq羣854192563討論

相關文章
相關標籤/搜索