[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")

参考

相关文章
|
7天前
|
Dart 前端开发 开发工具
【Flutter前端技术开发专栏】Flutter入门指南:搭建开发环境与第一个应用
【4月更文挑战第30天】本文介绍了Flutter SDK的安装和配置过程,以及如何创建并运行第一个Flutter应用。首先确保安装了Dart SDK和Flutter SDK,支持macOS、Linux和Windows。安装完成后,设置环境变量,然后通过`flutter doctor`验证安装。接着,使用`flutter create`命令创建新项目,进入项目目录并运行`flutter run`启动应用。在`main.dart`中修改代码以自定义应用。Flutter支持热重载和DevTools调试。本文为Flutter初学者提供了快速入门的指导。
【Flutter前端技术开发专栏】Flutter入门指南:搭建开发环境与第一个应用
|
7天前
|
Dart 前端开发 开发者
【Flutter前端技术开发专栏】Flutter Dart语言基础语法解析
【4月更文挑战第30天】Dart是Google为Flutter框架打造的高效编程语言,具有易学性、接口、混入、抽象类等特性。本文概述了Dart的基础语法,包括静态类型(如int、String)、控制流程(条件、循环)、函数、面向对象(类与对象)和异常处理。此外,还介绍了库导入与模块使用,帮助开发者快速入门Flutter开发。通过学习Dart,开发者能创建高性能的应用。
【Flutter前端技术开发专栏】Flutter Dart语言基础语法解析
|
8天前
|
Dart 测试技术 UED
Dart 和 Flutter 错误处理指南 | 最佳实践全解析
深入探索 Dart 和 Flutter 中的错误处理技术,从编译时错误到运行时异常,带你学习如何优雅地处理应用程序中的各种意外情况。了解最佳实践,让你的应用程序稳如磐石,用户体验持续优化!
Dart 和 Flutter 错误处理指南 | 最佳实践全解析
|
11天前
|
存储 缓存 开发框架
Flutter的网络请求:使用Dart进行HTTP请求的技术详解
【4月更文挑战第26天】了解Flutter网络请求,本文详述使用Dart进行HTTP请求
|
12天前
|
开发框架 Dart Java
Flutter的核心:Dart语言基础——语法与特性深度解析
【4月更文挑战第26天】Flutter框架背后的Dart语言,以其简洁的语法和独特特性深受开发者喜爱。本文深入解析Dart的语法与特性,如类型推导、动态静态类型系统、统一的类接口、访问权限控制以及并发编程支持。了解并掌握Dart,能助开发者更高效地利用Flutter构建高性能移动应用。
|
3月前
|
Dart JavaScript
Flutter - Dart 基础(数据类型)
【2月更文挑战第3天】
71 1
|
存储 Dart
[Flutter]足够入门的Dart语言系列之常见运算符或操作符
Dart中的运算符提供对数据操作和处理的能力,其中的算术运算符、逻辑运算符非常符合现实中的使用情况,其他不同的运算符则有着自己的操作逻辑...
465 0
[Flutter]足够入门的Dart语言系列之常见运算符或操作符
|
存储 缓存 Dart
[Flutter]足够入门的Dart语言系列之面向对象:类成员的可见性、常量和工厂构造函数详解
类和成员的可见性,这在基于库或包的开发中非常重要,Dart中提供了工厂构造函数,可以方便的实现单例、缓存实例对象、返回子类等,以及常量构造函数的使用......
244 0
[Flutter]足够入门的Dart语言系列之面向对象:类成员的可见性、常量和工厂构造函数详解
|
Dart
[Flutter]足够入门的Dart语言系列之函数:函数定义、调用、5种参数类型和main函数
函数(Function)也被称为方法(Method)。其最直观的理解就是数据中的函数,比如y=f(x),在编程中,f对输入x进行处理,返回结果y,就是一个函数......
767 0
[Flutter]足够入门的Dart语言系列之函数:函数定义、调用、5种参数类型和main函数
|
9月前
|
开发框架 Dart Java
Flutter中Dart语言常用知识
@[TOC](目录) Flutter 是一种使用 Dart 语言开发的跨平台移动应用程序框架。在 Flutter 中,Dart 语言是主要的编程语言,它提供了许多强大的功能和语法糖,可以让开发者更轻松地构建高性能、美观的应用程序。下面是 Flutter 中 Dart 语言的一些详细介绍和代码示例: # 1. 变量和数据类型 在 Dart 语言中,变量不需要声明,可以直接赋值。Dart 语言支持多种数据类型,包括整数、浮点数、布尔值、字符串、列表、映射等。例如: ```dart int a = 10; double b = 3.14; bool c = true; String