By default, Strings in Dart can't be used as Iterable, they must be converted to a List<int> or another kind of Iterable class. To do that, one must import the dart:convert module and start playing with the converters.
A pure ASCII string can be converted using ascii.encode(str), where str is the String to convert to List<int>.
import 'dart:convert';
void main() {
final str = "hello world";
for (var c in ascii.encode(str)) {
print("${c} (${String.fromCharCode(c)})");
}
}
$ dart run
104 (h)
101 (e)
108 (l)
108 (l)
111 (o)
32 ( )
119 (w)
111 (o)
114 (r)
108 (l)
100 (d)
The same can be done with utf8 Strings as well.
import 'dart:convert';
void main() {
final str = "波動拳: ↓↙←Ⓑ";
for (var c in utf8.encode(str)) {
print("${c} (${String.fromCharCode(c)})");
}
}
$ dart run
230 (æ)
179 (³)
162 (¢)
229 (å)
139 ()
149 ()
230 (æ)
139 ()
179 (³)
58 (:)
32 ( )
226 (â)
134 ()
147 ()
226 (â)
134 ()
153 ()
226 (â)
134 ()
144 (
226 (â)
146 ()
183 (·)
This output is "normal", because an utf8 character is encoded on 8, 16 or 32 bits, but the encoder will encode it only on 8 bits. This means an utf8 character will be split in more than one byte. A quick and dirty solution to avoid this issue is to use the String.split() method and iterate over the List generated.
void main() {
final str = "波動拳: ↓↙←Ⓑ";
for (var c in str.split("")) {
print("${c} : ${utf8.encode(c)}");
}
}
$ dart run
波 : [230, 179, 162]
動 : [229, 139, 149]
拳 : [230, 139, 179]
: : [58]
: [32]
↓ : [226, 134, 147]
↙ : [226, 134, 153]
← : [226, 134, 144]
Ⓑ : [226, 146, 183]
The 波 character is made of 3 integers [230, 179, 162], like the rest of the unicode characters displayed. Here a list of resources talking about that:
Cover Image by Julian Schultz on Unsplash
Top comments (0)