Skip to content

Commit 7aacaff

Browse files
authored
Drop UTF-8 BOM when present while decoding UTF-8 bytes into String (#1165)
1 parent 06ccc4c commit 7aacaff

File tree

2 files changed

+11
-0
lines changed

2 files changed

+11
-0
lines changed

Sources/FoundationEssentials/String/String+IO.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ extension String {
101101
}
102102
case .utf8:
103103
func makeString(buffer: UnsafeBufferPointer<UInt8>) -> String? {
104+
var buffer = buffer
105+
if buffer.starts(with: [0xEF, 0xBB, 0xBF]) {
106+
buffer = UnsafeBufferPointer(rebasing: buffer.suffix(from: 3))
107+
}
104108
if let string = String._tryFromUTF8(buffer) {
105109
return string
106110
}

Tests/FoundationEssentialsTests/StringTests.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,13 @@ final class StringTests : XCTestCase {
10041004

10051005
let utf32BEBOMStringMismatch = String(bytes: utf32BEWithBOM, encoding: String._Encoding.utf32LittleEndian)
10061006
XCTAssertNil(utf32BEBOMStringMismatch)
1007+
1008+
// UTF-8 With BOM
1009+
1010+
let utf8BOM = Data([0xEF, 0xBB, 0xBF])
1011+
let helloWorld = Data("Hello, world".utf8)
1012+
XCTAssertEqual(String(bytes: utf8BOM + helloWorld, encoding: String._Encoding.utf8), "Hello, world")
1013+
XCTAssertEqual(String(bytes: helloWorld + utf8BOM, encoding: String._Encoding.utf8), "Hello, world\u{FEFF}")
10071014
}
10081015

10091016
func test_dataUsingEncoding_preservingBOM() {

0 commit comments

Comments
 (0)