首页 > 解决方案 > 如何在 Dart 中编码为 UTF16 Little Endian?

问题描述

我正在尝试使用 Dart 操作程序使用的一些系统变量。我遇到了dart的utf包被停用的问题,我还没有找到任何方法将文件.write编码为UTF 16 Little Endian 。是否有一个库可以在 Dart 中进行字节到 UTF 16 LE 的转换?无论如何我都会使用 UTF,但它不是 null 安全的。我最终可能会尝试使用 utf 包源代码,但我在这里检查是否有我错过的本机(或 pub)实现,因为我是 UTF 和字节转换世界的新手。

我的目标:

encodeAsUtf16le(String s);

我不需要写 BOM。

标签: dartutf-16le

解决方案


DartString内部使用 UTF-16。您可以使用String.codeUnits获取 UTF-16 代码单元,然后以 little-endian 形式编写它们:

  var s = '\u{1F4A9}';
  var codeUnits = s.codeUnits;
  var byteData = ByteData(codeUnits.length * 2);
  for (var i = 0; i < codeUnits.length; i += 1) {
    byteData.setUint16(i * 2, codeUnits[i], Endian.little);
  }
  
  var bytes = byteData.buffer.asUint8List();
  await File('output').writeAsBytes(bytes);

或假设您在 little-endian 系统上运行:

  var s = '\u{1F4A9}';
  var codeUnits = s.codeUnits;
  var bytes = Uint16List.fromList(codeUnits).buffer.asUint8List();
  await File('output').writeAsBytes(bytes);

另请参阅https://stackoverflow.com/a/67802971/,这是关于将 UTF-16LE 编码为Strings。

我也觉得有必要建议不要将 UTF-16 写入磁盘,除非你被外部要求强迫。


推荐阅读