Potrebujem dekódovať utf-8-kódovaný reťazec, o ktorom neviem, počítanie byte. Poznám poznámku.
S počtom bajtov by som to urobil:
NSString(bytes: UnsafePointer<Byte>(bytes),
length: byteCount,
encoding: String.Encoding.utf8.rawValue)
Ako môžem použiť namiesto toho počet znakov?
odpovede:
3 pre odpoveď č. 1Možným riešením je použitie utf-8 UnicodeCodec
dekódovať bajtov, kým sa nedosiahne požadovaný počet znakov (alebo sa vyskytne chyba):
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
}
(Môžete sa tiež vrátiť nil
alebo chyba v chybe.)
Príklad:
let bytes = "H€llo".utf8
let dec = decodeUTF8(bytes: bytes, numCharacters: 3)
print(dec) // H€l