/ / Jak odkodować utf-8 znającą liczbę znaków, ale nie liczącą bajtów? - szybkie, kodowanie, utf-8

Jak rozszyfrować liczbę znaków wiedzących utf-8, ale nie liczbę bajtów? - szybkie, kodowanie, utf-8

Potrzebuję do odkodowania łańcucha zakodowanego za pomocą utf-8 Nie wiem, ile bajtów się liczy. Znam liczbę postaci.

Z liczbą bajtów, zrobiłbym to:

NSString(bytes:    UnsafePointer<Byte>(bytes),
length:   byteCount,
encoding: String.Encoding.utf8.rawValue)

Jak mogę zamiast tego użyć liczby znaków?

Odpowiedzi:

3 dla odpowiedzi № 1

Możliwym rozwiązaniem jest użycie utf-8 UnicodeCodec dekodować bajtów, aż do osiągnięcia pożądanej liczby znaków (lub wystąpi błąd):

func decodeUTF8<S: Sequence>(bytes: S, numCharacters: Int) -> String
where S.Iterator.Element == UInt8 {
var iterator = bytes.makeIterator()
var utf8codec = UTF8()
var string = ""
while string.characters.count < numCharacters {
switch (utf8codec.decode(&iterator)) {
case let .scalarValue(val):
string.unicodeScalars.append(val)
default:
// Error or out of bytes:
return string
}
}
return string
}

(Możesz również wrócić nil lub wyślij błąd w przypadku błędu.)

Przykład:

let bytes = "H€llo".utf8
let dec = decodeUTF8(bytes: bytes, numCharacters: 3)
print(dec)  // H€l