transcode(_:from:to:stoppingOnError:into:)
Translates the given input from one Unicode encoding to another by calling the given closure.
func transcode<Input, InputEncoding, OutputEncoding>(_ input: Input, from inputEncoding: InputEncoding.Type, to outputEncoding: OutputEncoding.Type, stoppingOnError stopOnError: Bool, into processCodeUnit: (OutputEncoding.CodeUnit) -> Void) -> Bool where Input : IteratorProtocol, InputEncoding : _UnicodeEncoding, OutputEncoding : _UnicodeEncoding, Input.Element == InputEncoding.CodeUnit
Parameters
- input
An iterator of code units to be translated, encoded as
inputEncoding
. IfstopOnError
isfalse
, the entire iterator will be exhausted. Otherwise, iteration will stop if an encoding error is detected.- inputEncoding
The Unicode encoding of
input
.- outputEncoding
The destination Unicode encoding.
- stopOnError
Pass
true
to stop translation when an encoding error is detected ininput
. Otherwise, a Unicode replacement character ("\u{FFFD}"
) is inserted for each detected error.- processCodeUnit
A closure that processes one
outputEncoding
code unit at a time.
Returns
true
if the translation detected encoding errors in input
; otherwise, false
.
Overview
The following example transcodes the UTF-8 representation of the string "Fermata 𝄐"
into UTF-32.
let fermata = "Fermata 𝄐"
let bytes = fermata.utf8
print(Array(bytes))
// Prints "[70, 101, 114, 109, 97, 116, 97, 32, 240, 157, 132, 144]"
var codeUnits: [UTF32.CodeUnit] = []
let sink = { codeUnits.append($0) }
transcode(bytes.makeIterator(), from: UTF8.self, to: UTF32.self,
stoppingOnError: false, into: sink)
print(codeUnits)
// Prints "[70, 101, 114, 109, 97, 116, 97, 32, 119056]"
The sink
closure is called with each resulting UTF-32 code unit as the function iterates over its input.