fn main() {
let f = |v| String::from_utf8(v).map(|s| s.chars().map(|c| c as u32).collect::<Vec<u32>>());
let g = |v: Vec<_>| {
print!("{:?}\n=> ", v.iter().map(|b| format!("{:X}", b)).collect::<Vec<_>>());
match f(v) {
Ok(cs) => println!("{:?}\n", cs.iter().map(|c| format!("U+{:04X}", c)).collect::<Vec<_>>()),
Err(e) => print!("{:?}\n", e.to_string())
}
};
g(vec!(0x6F, 0x64, 0x61, 0x69));
g(vec!(0xE3, 0x81, 0x8A, 0xE9, 0xA1, 0x8C));
g(vec!(0xC2, 0xA9, 0xF0, 0x9F, 0x8D, 0x94, 0xE9, 0xA6, 0x99, 0x41));
g(vec!(0xC2, 0xA9, 0xF0));
}
Zm4gbWFpbigpIHsKICAgIGxldCBmID0gfHZ8IFN0cmluZzo6ZnJvbV91dGY4KHYpLm1hcCh8c3wgcy5jaGFycygpLm1hcCh8Y3wgYyBhcyB1MzIpLmNvbGxlY3Q6OjxWZWM8dTMyPj4oKSk7CiAgICBsZXQgZyA9IHx2OiBWZWM8Xz58IHsKICAgICAgICBwcmludCEoIns6P31cbj0+ICIsIHYuaXRlcigpLm1hcCh8YnwgZm9ybWF0ISgiezpYfSIsIGIpKS5jb2xsZWN0Ojo8VmVjPF8+PigpKTsKICAgICAgICBtYXRjaCBmKHYpIHsKICAgICAgICAgICAgT2soY3MpID0+IHByaW50bG4hKCJ7Oj99XG4iLCBjcy5pdGVyKCkubWFwKHxjfCBmb3JtYXQhKCJVK3s6MDRYfSIsIGMpKS5jb2xsZWN0Ojo8VmVjPF8+PigpKSwKICAgICAgICAgICAgRXJyKGUpID0+IHByaW50ISgiezo/fVxuIiwgZS50b19zdHJpbmcoKSkKICAgICAgICB9CiAgICB9OwogICAgZyh2ZWMhKDB4NkYsIDB4NjQsIDB4NjEsIDB4NjkpKTsKICAgIGcodmVjISgweEUzLCAweDgxLCAweDhBLCAweEU5LCAweEExLCAweDhDKSk7CiAgICBnKHZlYyEoMHhDMiwgMHhBOSwgMHhGMCwgMHg5RiwgMHg4RCwgMHg5NCwgMHhFOSwgMHhBNiwgMHg5OSwgMHg0MSkpOwogICAgZyh2ZWMhKDB4QzIsIDB4QTksIDB4RjApKTsKfQo=
["6F", "64", "61", "69"]
=> ["U+006F", "U+0064", "U+0061", "U+0069"]
["E3", "81", "8A", "E9", "A1", "8C"]
=> ["U+304A", "U+984C"]
["C2", "A9", "F0", "9F", "8D", "94", "E9", "A6", "99", "41"]
=> ["U+00A9", "U+1F354", "U+9999", "U+0041"]
["C2", "A9", "F0"]
=> "invalid utf-8: invalid byte near index 2"