[Flutter]足够入门的Dart语言系列之正确认识和解读Runes与Symbols类型

简介: runes字符串的Unicode码点(integer Unicode code points),它公开了字符串的 Unicode 码位。使用字符串的runes属性可以获取该字符串对应的runes...

runes

runes字符串的Unicode码点(integer Unicode code points),它公开了字符串的 Unicode 码位。表示Unicode码点的整数。

Runes的含义和获取

使用字符串的runes属性可以获取该字符串对应的runes表示形式。

const string = 'Dart';
final runes = string.runes.toList();
print(runes); // [68, 97, 114, 116]

const emojiHeart = '♥';
print(emojiHeart.runes); // (9829)

Unicode为每一个字符、标点符号、表情符号等都定义了一个唯一的数值(即Unicode码点),可以表示任何字符。由于Dart字符串是UTF-16的字符序列,所以在字符串中表达32位的字符序列就需要特殊的语法。

通常使用\uXXXX的方式来表示Unicode字符, 这里的XXXX是4个16进制的数, 如,心形符号(♥)的 Unicode 为\u2665

对于非4个数值的情况,把编码值放到大括号中即可, 如,笑脸 emoji(😆) 是\u{1f600}

const emojiMan = '👨';
const emojiLaughing = '😆';

print(emojiMan.runes); // (128104)
print(emojiLaughing.runes); //(128518)   

codeUnits属性可以获取单位Unicode码点

//  "Man" emoji ('👨', U+1F468) 由 Surrogate pairs U+d83d and U+dc68 表示。
for (final item in emojiMan.codeUnits) {
  print(item.toRadixString(16));
  // d83d
  // dc68
}

emojiMan.codeUnitAt(idx)读取指定位置的单位码点。

如何正确读取大于U+FFFF码点的字符获

超出基本多文种平面(Basic Multilingual Plane (plane 0))的字符,即Unicode码点大于U+FFFF的字符,使用的是 Surrogate pairs 组合而成。此时查看该字符占用的字符长度为2,比如上面“Man”的emoji '👨'(U+1F468) 由 U+d83d and U+dc68 表示。

下面的'♥'和'😆'都是一个字符,由于码点不同,其长度一个为1,一个为2.

const emojiHeart = '♥';
const emojiLaughing = '😆';

print(emojiHeart.length);    // 1
print(emojiLaughing.length); // 2

这就需要正确的读写单个 Unicode 字符:可以使用 characters 包中定义的 characters getter。如下示例:

import 'package:characters/characters.dart';

void main(){
  const emojiHeart = '♥';
  const emojiLaughing = '😆';

  print('emojiHeart的长度:${emojiHeart.length}');
  print('emojiLaughing的长度:${emojiLaughing.length}');

  print('emojiHeart索引读取:${emojiHeart[0]}');
  print('emojiLaughing索引无法正确读取:${emojiLaughing[0]}');

  print('characters读写单个 Unicode 字符:${emojiLaughing.characters.elementAt(0)}');
  print('characters读写单个 Unicode 字符:${emojiLaughing.characters.first}');
}

输出:

emojiHeart的长度:1
emojiLaughing的长度:2
emojiHeart索引读取:♥
emojiLaughing索引无法正确读取:�
characters读写单个 Unicode 字符:😆
characters读写单个 Unicode 字符:😆

判断是否应该通过characters读取单个字符【正确读取字符】

const str1='😆Ab12';
const str2='♥Ab123';

// 判断是否是大于 U+FFFF 的码点
if(str1.length==str1.characters.length){
  print('str1直接通过索引读写单个字符即可');
}
else{
  print('str1需要通过characters读写单个 Unicode 字符');
}
// 判断是否是大于 U+FFFF 的码点
if(str2.length==str2.characters.length){
  print('str2直接通过索引读写单个字符即可');
}
else{
  print('str2需要通过characters读写单个 Unicode 字符');
}

输出

str1需要通过characters读写单个 Unicode 字符
str2直接通过索引读写单个字符即可

Runes对象的使用——由Unicode码点生成字符或字符串

创建Runes对象,将字符或者字符码点作为参数传递。通过String.fromCharCodes()方法可以读取Runes对象为字符串,从而实现将字符码点转化为可显示或可输出的字符。

Runes runes = new Runes('\u2665,\u{1f605},\u{1f60e}');
print(runes);   // (9829, 44, 128517, 44, 128526)

print(String.fromCharCodes(runes)); // ♥,😅,😎

Symbols

一个Symbol对象代表Dart程序中声明的操作符或者标识符。

也许不会用到Symbol,但是该功能对于通过名字来引用标识符的情况 是非常有价值的,特别是混淆后的代码,标识符的名字被混淆了,但是Symbol的名字不会改变。

可以使用在标识符前加 # 前缀来获取 Symbol:

var radix=10;
var bar='abc';

print(#radix);  // Symbol("radix")
print(#bar);    // Symbol("bar")

参考

相关文章
|
24天前
|
开发框架 Dart 前端开发
Flutter 是谷歌推出的一款高效跨平台移动应用开发框架,使用 Dart 语言,具备快速开发、跨平台支持、高性能、热重载及美观界面等特点。
Flutter 是谷歌推出的一款高效跨平台移动应用开发框架,使用 Dart 语言,具备快速开发、跨平台支持、高性能、热重载及美观界面等特点。本文从 Flutter 简介、特点、开发环境搭建、应用架构、组件详解、路由管理、状态管理、与原生代码交互、性能优化、应用发布与部署及未来趋势等方面,全面解析 Flutter 技术,助你掌握这一前沿开发工具。
54 8
|
3月前
|
Dart
如何在 Flutter 项目中使用 Dart 语言?
如何在 Flutter 项目中使用 Dart 语言?
137 58
|
1月前
|
Dart
flutter dart mixin 姿势
flutter dart mixin 姿势
|
1月前
|
Dart 安全 编译器
Flutter结合鸿蒙next 中数据类型转换的高级用法:dynamic 类型与其他类型的转换解析
在 Flutter 开发中,`dynamic` 类型提供了灵活性,但也带来了类型安全性问题。本文深入探讨 `dynamic` 类型及其与其他类型的转换,介绍如何使用 `as` 关键字、`is` 操作符和 `whereType<T>()` 方法进行类型转换,并提供最佳实践,包括避免过度使用 `dynamic`、使用 Null Safety 和异常处理,帮助开发者提高代码的可读性和可维护性。
84 1
|
2月前
|
Dart 开发者 Windows
flutter:dart的学习
本文介绍了Dart语言的下载方法及基本使用,包括在Windows系统上和VSCode中的安装步骤,并展示了如何运行Dart代码。此外,还详细说明了Dart的基础语法、构造函数、泛型以及库的使用方法。文中通过示例代码解释了闭包、运算符等概念,并介绍了Dart的新特性如非空断言操作符和延迟初始化变量。最后,提供了添加第三方库依赖的方法。
33 12
|
2月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
90 7
|
存储 Dart
[Flutter]足够入门的Dart语言系列之常见运算符或操作符
Dart中的运算符提供对数据操作和处理的能力,其中的算术运算符、逻辑运算符非常符合现实中的使用情况,其他不同的运算符则有着自己的操作逻辑...
640 0
[Flutter]足够入门的Dart语言系列之常见运算符或操作符
|
存储 缓存 Dart
[Flutter]足够入门的Dart语言系列之面向对象:类成员的可见性、常量和工厂构造函数详解
类和成员的可见性,这在基于库或包的开发中非常重要,Dart中提供了工厂构造函数,可以方便的实现单例、缓存实例对象、返回子类等,以及常量构造函数的使用......
309 0
[Flutter]足够入门的Dart语言系列之面向对象:类成员的可见性、常量和工厂构造函数详解
|
Dart
[Flutter]足够入门的Dart语言系列之函数:函数定义、调用、5种参数类型和main函数
函数(Function)也被称为方法(Method)。其最直观的理解就是数据中的函数,比如y=f(x),在编程中,f对输入x进行处理,返回结果y,就是一个函数......
1060 0
[Flutter]足够入门的Dart语言系列之函数:函数定义、调用、5种参数类型和main函数
|
7月前
|
前端开发 C++ 容器
Flutter-完整开发实战详解(一、Dart-语言和-Flutter-基础)(1)
Flutter-完整开发实战详解(一、Dart-语言和-Flutter-基础)(1)