【问题标题】:UTF-16LE txt file decode as String in Flutter (dart)UTF-16LE txt 文件在 Flutter (dart) 中解码为字符串
【发布时间】:2021-06-02 18:27:58
【问题描述】:

要读取我正在使用的 .txt 文件的文件内容

List<String> linesList = await file.readAsLines(encoding: latin1);
return linesList;

带有编码 UTF-8 的文件与上述代码完美配合。 但是对于编码 UTF-16LE,它返回一个长度为文件中行长度两倍的列表,但除了第一行之外都是空的。第一个索引包含 ÿþ#

【问题讨论】:

  • “使用编码 UTF-8 的文件运行良好......” 这似乎不太可能,因为您正在使用 Latin-1 编码而不是 UTF-8 读取文件。如果您想以这种方式读取 UTF-16LE 文件,那么您需要提供(并可能实现)一个 UTF-16LE Encoding。 (将文件存储为 UTF-16 是个坏主意,应尽可能避免。)
  • utf 包中有一个 UTF16-LE 解码器。 pub.dev/packages/utf
  • @jamesdlin 我没有创建这个文件。我正在使用从某些软件中导入的文件,然后从该文件中提取数据并将其保存在服务器上。
  • @RichardHeap ,我检查了你在评论中提到的 utf 包。它似乎很有用。我将对此进行调查并进行更新。谢谢:)
  • @RichardHeap 非常感谢。你提到了正确的颤振包。使用这个包,我能够从任何 utf 格式解析文件,并在应用程序中将其显示为字符串。再次非常感谢。这意味着很多:)

标签: flutter dart


【解决方案1】:

由于package:utf 现在已被放弃(因此永远不会支持空安全),另一种将 UTF-16LE 文件作为String 读取的方法是利用 Dart Strings 使用 UTF-16 代码单位内部。因此,您可以读取文件,将数据解释为 16 位(无符号)整数,然后使用这些作为 UTF-16 代码单元创建 String

基本上:

var f = File("utf-16le.txt");
var bytes = f.readAsBytesSync();

// Note that this assumes that the system's native endianness is the same as
// the file's.
var utf16CodeUnits = bytes.buffer.asUint16List();

var s = String.fromCharCodes(utf16CodeUnits);

我还将它作为练习留给读者处理文件开头的潜在 BOM。

另见https://github.com/dart-lang/convert/issues/30,它要求 Dart SDK 提供 UTF-16 转换函数。

【讨论】:

  • 经过数小时的研究,您拯救了我的一天,谢谢!
【解决方案2】:

所以第一个功劳归于@Richard_Heap,他对上述问题发表了评论。他提到了一个对 UTF 格式进行编码和解码的 dart 包。我已经能够使用这个包在我的 Flutter 应用程序中按预期解码 txt 文件。

首先,我通过@Richard_Heap 提到的包中提供的这些函数来识别 utf 格式类型

 List<int> bytes = await file.readAsBytes();

hasUtf16beBom(bytes)
hasUtf16Bom(bytes)}
hasUtf16leBom(bytes)
hasUtf32beBom(bytes)
hasUtf32Bom(bytes)
hasUtf32leBom(bytes)

一旦使用上述函数知道了 utf 格式,就可以在这个包中使用不同的解码器和编码器函数。就像我用过的一样

String decodedString = decodeUtf16le(bytes);

【讨论】:

    猜你喜欢
    • 2017-02-28
    • 2014-09-12
    • 1970-01-01
    • 2012-12-04
    • 2020-11-07
    • 2019-09-23
    • 2021-04-12
    • 1970-01-01
    • 2018-04-30
    相关资源
    最近更新 更多