【问题标题】:How to encode to UTF16 Little Endian in Dart?如何在 Dart 中编码为 UTF16 Little Endian?
【发布时间】:2021-09-06 10:00:44
【问题描述】:

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

我的目标:

encodeAsUtf16le(String s);

我不需要写 BOM。

【问题讨论】:

    标签: dart utf-16le


    【解决方案1】:

    Dart Strings 内部使用 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 写入磁盘,除非您被外部要求强制这样做。

    【讨论】:

    • 是的,一个引导加载程序我正在创建一个程序,用于在启动时将 UTF-16 数据读取到 EFI 分区并将用户选择写入文件。你的方法效果很好,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2020-12-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    相关资源
    最近更新 更多