目前的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討論