Може ли преобразуването на низ в данни с UTF-8 кодиране някога да се провали?

За да конвертирате екземпляр String в екземпляр Data в Swift, можете да използвате data(using:allowLossyConversion:), който връща незадължителен екземпляр Data.

Може ли върнатата стойност на тази функция някога да бъде nil, ако кодирането е UTF-8 (String.Encoding.utf8)?

Ако върнатата стойност не може да бъде nil, би било безопасно винаги да разопаковате принудително такова преобразуване.


person Max    schedule 11.09.2017    source източник
comment
stackoverflow.com/a/28522827/2303865   -  person Leo Dabus    schedule 11.09.2017


Отговори (1)


UTF-8 може да представлява всички валидни Unicode кодови точки, следователно преобразуването на Swift низ в UTF-8 данни не може да се провали.

Принудителното разопаковане

let string = "some string .."
let data = string.data(using: .utf8)!

безопасно е.

Същото би било вярно за .utf16 или .utf32, но не и за кодировки, които представляват само ограничен набор от символи, като .ascii или .isoLatin1.

Можете алтернативно да използвате изгледа .utf8 на низ, за ​​да създадете UTF-8 данни, като избягвате принудителното разгъване:

let string = "some string .."
let data = Data(string.utf8)
person Martin R    schedule 11.09.2017
comment
Благодаря, че споменахте Data(string.utf8) – пропуснах това. .nonLossyASCII също трябва да работи, тъй като преобразува уникод знаците в тяхната последователност за екраниране, например "ö".data(using: .nonLossyASCII) = \366. - person Max; 11.09.2017
comment
Как бих преобразувал данни в низ - person AbuTaareq; 25.01.2018
comment
нека newString = String(данни: данни!, кодиране: String.Encoding.utf8) като низ! - person AbuTaareq; 25.01.2018
comment
@AbuTaareq: Преобразуването от данни в низ може да се провали, така че ще бъде if let newString = String(data: data, encoding: .utf8) { ... } - person Martin R; 25.01.2018