builtin: add string.runes() (#10611)
parent
1e896c7020
commit
6838030ab5
|
@ -68,6 +68,21 @@ pub fn vstrlen(s &byte) int {
|
|||
return unsafe { C.strlen(&char(s)) }
|
||||
}
|
||||
|
||||
pub fn (s string) runes() []rune {
|
||||
mut runes := []rune{cap: s.len}
|
||||
for i := 0; i < s.len; i++ {
|
||||
char_len := utf8_char_len(unsafe { s.str[i] })
|
||||
if char_len > 1 {
|
||||
mut r := unsafe { s[i..i + char_len] }
|
||||
runes << r.utf32_code()
|
||||
i += char_len - 1
|
||||
} else {
|
||||
runes << unsafe { s.str[i] }
|
||||
}
|
||||
}
|
||||
return runes
|
||||
}
|
||||
|
||||
// tos converts a C string to a V string.
|
||||
// String data is reused, not copied.
|
||||
[unsafe]
|
||||
|
|
|
@ -950,3 +950,13 @@ fn test_interpolation_after_quoted_variable_still_works() {
|
|||
cccq := 'Replacing "$cc" with "$tt"'
|
||||
assert cccq == 'Replacing "abc" with "xyz"'
|
||||
}
|
||||
|
||||
fn test_emoji_to_runes() {
|
||||
x := '👋'
|
||||
assert x.runes()[0] == `👋`
|
||||
}
|
||||
|
||||
fn test_string_to_rune() {
|
||||
x := 'Hello World 👋'
|
||||
assert x.runes().len == 13
|
||||
}
|
||||
|
|
|
@ -3147,8 +3147,9 @@ fn (mut g Gen) expr(node ast.Expr) {
|
|||
if node.val == r'\`' {
|
||||
g.write("'`'")
|
||||
} else {
|
||||
// TODO: optimize use L-char instead of u32 when possible
|
||||
if utf8_str_len(node.val) < node.val.len {
|
||||
g.write("L'$node.val'")
|
||||
g.write('((u32)0x$node.val.utf32_code().hex())')
|
||||
} else {
|
||||
g.write("'$node.val'")
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue