[Swift] String - #7 Initializer(3) : Converting a C String
Converting a C String
init?(bytes: S, encoding: String.Encoding) where S : Sequence, S.Element == UInt8
- 주어진 인코딩에 따라 주어진 시퀀스를 사용해서 String을 생성한다.
init?(bytesNoCopy bytes: UnsafeMutableRawPointer, length: Int, encoding: String.Encoding, freeWhenDone flag: Bool)
- 주어진 바이트 버퍼에서 주어진 인코딩 방식으로 주어진 바이트 수 만큼으로 String을 생성한다.
- 이 초기화 메소드는 memory-safe하지 않다.
init(cString:UnsafePointer<Uint8>)
init(cString: UnsafePointer<CChar>)
- null-terminated UTF-8 데이터를 복사하여 새로운 String을 생성한다.
- 잘못된 형식을 포함하는 경우 �("\\u{FFFD}")로 대체된다.
let validUTF8: [CChar] = [67, 97, 102, -61, -87, 0]
validUTF8.withUnsafeBufferPointer { ptr in
let s = String(cString: ptr.baseAddress!)
print(s)
}
// Prints "Café"
let invalidUTF8: [CChar] = [67, 97, 102, -61, 0]
invalidUTF8.withUnsafeBufferPointer { ptr in
let s = String(cString: ptr.baseAddress!)
print(s)
}
// Prints "Caf�"
init?(cString: UnsafePointer<CChar>, encoding enc: String.Encoding)
- 지정된 인코딩 방식에 따라서 바이트 배열으로 String을 초기화한다.
init<Encoding>(decodingCString ptr: UnsafePointer<Encoding.CodeUnit>, as sourceEncoding: Encoding.Type) where Encoding : _UnicodeEncoding
- null-terminated 시퀀스의 포인터를 사용해서 지정된 인코딩으로 String을 초기화한다.
static func decodeCString<Encoding>(_ cString: UnsafePointer<Encoding.CodeUnit>?, as encoding: Encoding.Type, repairingInvalidCodeUnits isRepairing: Bool = true) -> (result: String, repairsMade: Bool)? where Encoding : _UnicodeEncoding
- 지정된 인코딩 방식으로 지정된 포인터가 참조하는 null-terminated 데이터를 복사하여 새로운 String을 생성한다.
- isRepairing을 true로 전달하면 잘못된 형식의 시퀀스는 �("\\u{FFFD}")로 대체하여 String을 생성한다.
- isRepairing을 flase로 전달하면 잘못된 형식의 시퀀스가 존재하는 경우 nil을 리턴한다.
- 아래는 CChar 배열을 가리키는 포인터(유효한 UTF8 형식의 시퀀스와 잘못된 형식의 UTF8 시퀀스)를 사용해서 String을 초기화 하는 예제이다. 잘못된 형식을 repair해서 리턴한 경우 튜플의 두 번째 인자인 repairsMade가 true가 된다.
let validUTF8: [UInt8] = [67, 97, 102, 195, 169, 0]
validUTF8.withUnsafeBufferPointer { ptr in
let s = String.decodeCString(ptr.baseAddress,
as: UTF8.self,
repairingInvalidCodeUnits: true)
print(s)
}
// Prints "Optional((Café, false))"
let invalidUTF8: [UInt8] = [67, 97, 102, 195, 0]
invalidUTF8.withUnsafeBufferPointer { ptr in
let s = String.decodeCString(ptr.baseAddress,
as: UTF8.self,
repairingInvalidCodeUnits: true)
print(s)
}
// Prints "Optional((Caf�, true))"
참고문서
https://developer.apple.com/documentation/swift/string
https://books.apple.com/us/book/the-swift-programming-language-swift-5-1/id881256329