@@ -178,6 +178,10 @@ extension String {
178
178
/// Creates a string by copying the data from a given
179
179
/// C array of UTF8-encoded bytes.
180
180
public init ? ( utf8String bytes: UnsafePointer < CChar > ) {
181
+ if let str = String ( validatingUTF8: bytes) {
182
+ self = str
183
+ return
184
+ }
181
185
if let ns = NSString ( utf8String: bytes) {
182
186
self = String . _unconditionallyBridgeFromObjectiveC ( ns)
183
187
} else {
@@ -202,12 +206,18 @@ extension String {
202
206
/// - Parameters:
203
207
/// - bytes: A sequence of bytes to interpret using `encoding`.
204
208
/// - encoding: The ecoding to use to interpret `bytes`.
205
- public init ? < S: Sequence > ( bytes: __shared S, encoding: Encoding )
206
- where S. Iterator. Element == UInt8 {
209
+ public init ? < S: Sequence > ( bytes: __shared S, encoding: Encoding )
210
+ where S. Iterator. Element == UInt8 {
207
211
let byteArray = Array ( bytes)
212
+ if encoding == . utf8,
213
+ let str = byteArray. withUnsafeBufferPointer ( { String . _tryFromUTF8 ( $0) } )
214
+ {
215
+ self = str
216
+ return
217
+ }
218
+
208
219
if let ns = NSString (
209
220
bytes: byteArray, length: byteArray. count, encoding: encoding. rawValue) {
210
-
211
221
self = String . _unconditionallyBridgeFromObjectiveC ( ns)
212
222
} else {
213
223
return nil
@@ -365,6 +375,10 @@ extension String {
365
375
cString: UnsafePointer < CChar > ,
366
376
encoding enc: Encoding
367
377
) {
378
+ if enc == . utf8, let str = String ( validatingUTF8: cString) {
379
+ self = str
380
+ return
381
+ }
368
382
if let ns = NSString ( cString: cString, encoding: enc. rawValue) {
369
383
self = String . _unconditionallyBridgeFromObjectiveC ( ns)
370
384
} else {
@@ -381,6 +395,14 @@ extension String {
381
395
/// Returns a `String` initialized by converting given `data` into
382
396
/// Unicode characters using a given `encoding`.
383
397
public init ? ( data: __shared Data, encoding: Encoding ) {
398
+ if encoding == . utf8,
399
+ let str = data. withUnsafeBytes ( {
400
+ String . _tryFromUTF8 ( $0. bindMemory ( to: UInt8 . self) )
401
+ } ) {
402
+ self = str
403
+ return
404
+ }
405
+
384
406
guard let s = NSString ( data: data, encoding: encoding. rawValue) else { return nil }
385
407
self = String . _unconditionallyBridgeFromObjectiveC ( s)
386
408
}
0 commit comments