[英]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 NUL
( 0
)是 UTF-8 中允許的字符。 看起來之前的更新沒有實現解碼權並忽略了NUL
字符。 應該預料到NUL
字符在 UTF-8 中作為格式良好的字符存在。
官方文檔還說:
如果
allowMalformed
為true
,則解碼器將無效(或未終止的)字符序列替換為 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.