FlutterHTTP响应。BodyBad UTF8编码

问题描述 投票:0回答:4
我的问题是,我读的只有一个,因为这个错误,我无法刮擦数据:

mangas

我的刮板代码

FormatException (FormatException: Bad UTF-8 encoding 0x22 (at offset 369))
给出错误的

Future<Manga> getMangaInfo(source) async{ final response = await _client.get(source); var manga; print(response.body);//error occurs here final document = parse(response.body); final mangaInfo = document.getElementsByClassName('tamanho-bloco-perfil'); for(Element infos in mangaInfo){ final infoCont = infos.getElementsByClassName('row'); //get titulo Element tituloCont = infoCont[0]; final tituloH = tituloCont.getElementsByTagName('h2'); Element tituloCont2 = tituloH[0]; String titulo = '['+tituloCont2.text+']'; //print(titulo); //get capa Element capaCont = infoCont[2]; final capaImg = capaCont.getElementsByTagName('img'); Element capaCont2 = capaImg[0]; final capaUrl = capaCont2.attributes['src']; //get caprecente final capsPorNumero = document.getElementsByClassName('row lancamento-linha'); final caps = capsPorNumero[0].getElementsByTagName('a'); Element info = caps[0]; final numero = info.text.split(' ')[1]; final capRecenteUrl = info.attributes['href']; manga = Manga(null,source,titulo,capaUrl,numero,capRecenteUrl); } return manga; } 我还尝试使用

response.body
和解码,但仍然无法修复它

这里是指页面的链接:

https://unionleitor.top/perfil-manga/kimetsu-no-yaiba

我猜是问题是html头上以下元标记上的字符

response.bodyBytes

我还找不到解决方案,也许我只是看了错误的地方。 谁能帮我解决这个问题? thanks!

我只是做:

<meta name="description" content="Kimetsu no Yaiba - Novo mangá sobrenatural da Shonen Jump. O mangá conta a história de Tanjiro, o filho mais velho de uma família que �">

如果您要获得JSON

utf8.decode(response.bodyBytes);

html http flutter utf-8
4个回答
57
投票
Solution1

在没有定义的CHARSET的情况下,HTTP被认为是在ISO-8859-1(Latin-1)中编码的。从描述中,身体与这种行为一致。 如果服务器响应将内容类型标头设置为应用程序/JSON; charset = UTF-8身体应按预期工作。

当然,问题是有一些服务器没有为JSON设置Charset(有效),但这也是两个规格之间的灰色区域:
json总是应该是UTF-8,因此您不需要设置Charset,而是..
除非明确设置Charset,否则HTTP始终是ISO-8859-1。
与HTTP定义相比,“智能” HTTP客户端可以选择遵循JSON定义,并简单地说任何应用程序/JSON默认情况下是UTF -8-从技术上讲违反HTTP标准。
但是,最终的解决方案最终是服务器明确说明按照这两个标准有效的CHARSET。

jsonDecode(utf8.decode(response.bodyBytes))

Solution2(颤音)

2
投票
使用替换替换响应。

HttpClientRequest request = await HttpClient().post(_host, 4049, path) /*1*/ ..headers.contentType = ContentType.json /*2*/ ..write(jsonEncode(jsonData)); /*3*/ HttpClientResponse response = await request.close(); /*4*/ await response.transform(utf8.decoder /*5*/).forEach(print);

Sloute3(PHP)

使用PHP文件首先获取内容,然后使用您的URL 并使用str_replacephp

newString.replaceAll('�', '');
希望它有帮助
    

从您的后端,您需要使用内容类型发送响应:

       $curlSession = curl_init();
        curl_setopt($curlSession, CURLOPT_URL, 'YOUR-URL');
        curl_setopt($curlSession, CURLOPT_BINARYTRANSFER, true);
        curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);

        $jsonData = curl_exec($curlSession);
echo $bodytag = str_replace("�", "", $jsonData);

        curl_close($curlSession);

最重要的位是UTF-8。 DART HTTP将使用

application/json; charset=utf-8

作为您的编码格式。如果不提供,它会使用其他东西。

这两种方法应解决您的问题:
wolder api:

utf-8

1
投票
or

NewerAPI(在引擎盖下使用UTF8 -Decoder):


Utf8Decoder().convert(response.bodyBytes)

getter
utf8.decode(response.bodyBytes)

执行执行解码以获取其字符串值,但假设您的API会以UTF8格式返回,这就是为什么您可能会从解码中获得一些奇怪的字符

0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.