簡體   English   中英

Dart/Flutter 中帶有“dart:convert”的奇怪解碼錯誤

[英]Strange decoding bug in Dart/Flutter with 'dart:convert'

由於我更新了 Flutter 和所有庫,因此在解碼字節列表時遇到了一個奇怪的錯誤。

該應用程序與具有如下flutter_blue庫的藍牙設備通信:

import 'dart:convert';

var result = await characteristic.read(); // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
return utf8.decode(result, allowMalformed: true);

解碼后的字符串顯示在小部件中。 以前,我沒有問題,字符串似乎是空的。 但最近一切都更新了,字符串在控制台中看起來是空的,但在小部件中卻不是,因為我看到幾個空方塊作為字符。 並且字符串的長度,即使在修剪方法之后,也是 15,而不是 0。

我在互聯網上找不到有關此更改的任何原因,也沒有找到解決問題的方法。

你遇到過這個bug嗎? 你有好的解決辦法嗎?

謝謝

編輯:結果與 allowMalformed = true 相同,與

new String.fromCharCodes(result)

我認為僅解碼 0 時存在顫振錯誤

Char NUL0 )是 UTF-8 中允許的字符。 看起來之前的更新沒有實現解碼權並忽略了NUL字符。 應該預料到NUL字符在 UTF-8 中作為格式良好的字符存在。

官方文檔還說:

如果allowMalformedtrue ,則解碼器將無效(或未終止的)字符序列替換為 Unicode 替換字符U+FFFD (�)。

因此,此問題的解決方案是解析結果字符串並檢查/替換NUL字符和/或 Unicode 替換字符。

在我的問題中進行編輯時,尾隨零似乎存在問題。

從十進制到字符串,空格等於 32,0 通常是一個空字符。 但現在已經不是了。

我找到的解決方案是

var result = await characteristic.read();
var tempResult = List<int>.from(result);
tempResult.removeWhere((item) => item == 0);
return utf8.decode(tempResult, allowMalformed: true);

我將第一個列表復制到一個可變列表中,並從中刪除所有 0。 那是完美的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM