• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

flutter[dart] utf16转unicode

武飞扬头像
LLLIIYYY
帮助2

项目中遇到了需要使用freetype工具取模中日韩和emoji等字符的场景, 其中遇到了一些关于取模调用的问题记录一下.
在Dart等常见语言中, emoji字符会占用两个字符长度, 取模的时候如果按照字符长度去获取unicode编码会将这些字符切分导致乱码. Dart语音提供了将字符串按照字符分割的方法:str.characters. 返回的类型可以通过codeUnits属性获取到字符对应的utf16编码数组.

以下为获取字符串unicodes的示例

/// 获取字符串每个字符
static List<int> str2unicodes(Sring str){
	return str.characters
        .map((e) => e.codeUnits)
        .map((v) => utf162unicode(v.toList()))
        .toList();
}

  /// utf16转unicode
  static int utf162unicode(List<int> utf8s) {
    if (utf8s.length == 1) {
      return utf8s[0];
    } else if (utf8s.length == 2) {
      int vh = (utf8s[0] - 0xD800) << 10;
      int vl = utf8s[1] - 0xDC00;
      return vh   vl   0x10000;
    }
    return 0;
  }
	/// unicode转utf16
  static List<int> unicode2utf16(int unicode) {
    List<int> res = [];
    if (unicode < 0 || unicode > 0x10ffff) {
      print("error");
      return res;
    } else {
      if (unicode < 0x10000) {
        res.add(unicode);
      } else {
        unicode = unicode - 0x10000;
        int vh = (unicode & 0xFFC00) >> 10;
        int vl = unicode & 0x3ff;
        res.add(0xD800 | vh);
        res.add(0xDC00 | vl);
      }
      return res;
    }
  }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbjejh
系列文章
更多 icon
同类精品
更多 icon
继续加载