编解码转换相关

Uri

使用 encodeFull()decodeFull() 方法,对URI中除了特殊字符(例如 /:&#)以外的字符进行编解码

  1. var uri = 'http://example.org/api?foo=some message';
  2. // 编码
  3. var encode = Uri.encodeFull(uri);
  4. print(encode); //http://example.org/api?foo=some%20message
  5. // 解码
  6. print(Uri.decodeFull(encode) == uri); //true

使用 encodeComponent()decodeComponent() 方法,对 URI 中具有特殊含义的所有字符串,
特殊字符包括(但不限于)/&:

  1. var uri = 'http://example.org/api?foo=some message';
  2. // 编码
  3. var encode = Uri.encodeComponent(uri);
  4. print(encode); //http%3A%2F%2Fexample.org%2Fapi%3Ffoo%3Dsome%20message
  5. // 解码
  6. print(Uri.decodeComponent(encode) == uri); //true

解析URI

  1. var uri = 'http://example.org:8000/foo/bar#frag?foo=some&age=18';
  2. var u = Uri.parse(uri);
  3. print(u.scheme); //"http"
  4. print(u.host); //"example.org"
  5. print(u.path); //"/foo/bar"
  6. print(u.fragment); //"frag?foo=some&age=18"
  7. print(u.origin); //"http://example.org:8000"
  8. var uri2 = Uri(
  9. scheme: 'http',
  10. host: 'example.org',
  11. path: '/foo/bar',
  12. fragment: 'frag',
  13. );
  14. print(uri2.toString()); //http://example.org/foo/bar#frag

JSON

  1. import "dart:convert";
  2. void main() {
  3. var j1 = '''
  4. [
  5. {"name": "张三", "age": 18},
  6. {"name": "李四", "age": 20}
  7. ]
  8. ''';
  9. // JSON字符串 转换为 Map对象
  10. var s1 = jsonDecode(j1);
  11. var s2 = json.decode(j1);
  12. print(s1); //[{name: 张三, age: 18}, {name: 李四, age: 20}]
  13. print(s2); //[{name: 张三, age: 18}, {name: 李四, age: 20}]
  14. // Map对象 转换为 JSON字符串
  15. print(jsonEncode(s1)); //[{"name":"张三","age":18},{"name":"李四","age":20}]
  16. print(json.encode(s1)); //[{"name":"张三","age":18},{"name":"李四","age":20}]
  17. }

只有 int, double, String, bool, null, List, 或者 Map 类型对象可以直接编码成 JSON。 List 和 Map 对象进行递归编码。

不能直接编码的对象有两种方式对其编码。 第一种方式是调用 encode() 时赋值第二个参数, 这个参数是一个函数, 该函数返回一个能够直接编码的对象 第二种方式是省略第二个参数,着这种情况下编码器调用对象的 toJson() 方法。 更多示例及 JSON 包相关链接,参考 JSON Support

编解码UTF-8字符

  1. List<int> utf8Bytes = [
  2. 0xc3, 0x8e, 0xc3, 0xb1, 0xc5, 0xa3, 0xc3, 0xa9,
  3. 0x72, 0xc3, 0xb1, 0xc3, 0xa5, 0xc5, 0xa3, 0xc3,
  4. 0xae, 0xc3, 0xb6, 0xc3, 0xb1, 0xc3, 0xa5, 0xc4,
  5. 0xbc, 0xc3, 0xae, 0xc5, 0xbe, 0xc3, 0xa5, 0xc5,
  6. 0xa3, 0xc3, 0xae, 0xe1, 0xbb, 0x9d, 0xc3, 0xb1
  7. ];
  8. // 使用 utf8.decode() 解码 UTF8 编码的字符创为 Dart 字符创:
  9. var funnyWord = utf8.decode(utf8Bytes);
  10. var s2 = 'Îñţérñåţîöñåļîžåţîờñ';
  11. print(funnyWord == s2); //true
  12. // 使用 utf8.encode() 将 Dart 字符串编码为一个 UTF8 编码的字节流:
  13. print(utf8.encode(s2)); // [195, 142, 195, 177, ... , 157, 195, 177]

将 UTF-8 字符串流转换为 Dart 字符串,为 Stream 的 transform() 方法上指定 utf8.decoder

  1. var lines = inputStream
  2. .transform(utf8.decoder)
  3. .transform(LineSplitter());
  4. try {
  5. await for (var line in lines) {
  6. print('Got ${line.length} characters from stream');
  7. }
  8. print('file is now closed');
  9. } catch (e) {
  10. print(e);
  11. }

定时器

  1. import 'dart:async';
  2. void main() {
  3. // 回调1次
  4. Timer(Duration(milliseconds: 1000), () {
  5. print('end: ${DateTime.now()}');
  6. });
  7. // start: 2020-12-03 19:25:39.619022
  8. // end: 2020-12-03 19:25:40.627231
  9. // 回调多次
  10. int num = 0;
  11. print('num -- ${num}: ${DateTime.now()}');
  12. Timer.periodic(Duration(milliseconds: 1000), (t) {
  13. num++;
  14. print('num -- ${num}: ${DateTime.now()}');
  15. if (num >= 5) {
  16. t.cancel(); // 取消定时器
  17. t = null;
  18. }
  19. });
  20. // num -- 0: 2020-12-03 19:26:08.109163
  21. // num -- 1: 2020-12-03 19:26:09.113760
  22. // num -- 2: 2020-12-03 19:26:10.110394
  23. // num -- 3: 2020-12-03 19:26:11.110795
  24. // num -- 4: 2020-12-03 19:26:12.110285
  25. // num -- 5: 2020-12-03 19:26:13.110871
  26. }

其他功能

dart:convert 库同样包含 ASCII 和 ISO-8859-1 (Latin1) 转换器。 更多详情,参考 API docs for the dart:convert library。