Как превратить массив кодовых точек (Int32) в строку?

В Crystal строка может быть превращена в массив (Int32) кодовых точек:

"abc".codepoints # [97,98,99] 

Есть ли способ превратить массив обратно в строку?

2 ответа

  str     = "aа€æ∡"
  arr     = str.codepoints              # Array(Int32)
  new_str = arr.map { |x| x.chr }.join

  puts str
  puts new_str
  puts(str == new_str)

Метод экземпляра.chr можно использовать для получения кодовой точки Unicode для Int. Ты тогда .join отдельные персонажи в новую строку.

Вот один из способов:

arr   = "abc".codepoints

# The line below allocates memory and returns a "safe" pointer (ie slice) to it.
# The allocated memory is on the heap with size:
#    arr.size * sizeof(0_u8)
#    sizeof(0_u8) == 8 bits
# A slice of uint8 values (i.e. `Slice(UInt8)`) is aliased
#    in Crystal as `Bytes`.
bytes = Slice.new(arr.size, 0_u8) 
# You can also use the alias: Bytes.new(arr.size, 0_u8)

arr.each_with_index { |v, i|
  bytes[i] = v.to_u8
}
puts String.new(bytes).inspect # => "abc"

Тем не менее, вышеприведенный сбой для многобайтовых кодовых точек: "a€æ∡"

Другие вопросы по тегам