Skip to content

Commit ef6509a

Browse files
authored
Merge pull request #928 from mohitathwani/String_used_encoding
2 parents 698ee76 + 18cafb1 commit ef6509a

File tree

5 files changed

+44
-2
lines changed

5 files changed

+44
-2
lines changed

Foundation/NSString.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,12 +1261,18 @@ extension NSString {
12611261
let readResult = try NSData(contentsOf: url, options:[])
12621262

12631263
let bytePtr = readResult.bytes.bindMemory(to: UInt8.self, capacity:readResult.length)
1264-
if readResult.length >= 2 && bytePtr[0] == 254 && bytePtr[1] == 255 {
1264+
if readResult.length >= 4 && bytePtr[0] == 0xFF && bytePtr[1] == 0xFE && bytePtr[2] == 0x00 && bytePtr[3] == 0x00 {
1265+
enc?.pointee = String.Encoding.utf32LittleEndian.rawValue
1266+
}
1267+
else if readResult.length >= 2 && bytePtr[0] == 0xFE && bytePtr[1] == 0xFF {
12651268
enc?.pointee = String.Encoding.utf16BigEndian.rawValue
12661269
}
1267-
else if readResult.length >= 2 && bytePtr[0] == 255 && bytePtr[1] == 254 {
1270+
else if readResult.length >= 2 && bytePtr[0] == 0xFF && bytePtr[1] == 0xFE {
12681271
enc?.pointee = String.Encoding.utf16LittleEndian.rawValue
12691272
}
1273+
else if readResult.length >= 4 && bytePtr[0] == 0x00 && bytePtr[1] == 0x00 && bytePtr[2] == 0xFE && bytePtr[3] == 0xFF {
1274+
enc?.pointee = String.Encoding.utf32BigEndian.rawValue
1275+
}
12701276
else {
12711277
//Need to work on more conditions. This should be the default
12721278
enc?.pointee = String.Encoding.utf8.rawValue
216 Bytes
Binary file not shown.
216 Bytes
Binary file not shown.

TestFoundation/TestNSString.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ class TestNSString : XCTestCase {
6868
("test_FromContentsOfURL",test_FromContentsOfURL),
6969
("test_FromContentsOfURLUsedEncodingUTF16BE", test_FromContentsOfURLUsedEncodingUTF16BE),
7070
("test_FromContentsOfURLUsedEncodingUTF16LE", test_FromContentsOfURLUsedEncodingUTF16LE),
71+
("test_FromContentsOfURLUsedEncodingUTF32BE", test_FromContentsOfURLUsedEncodingUTF32BE),
72+
("test_FromContentsOfURLUsedEncodingUTF32LE", test_FromContentsOfURLUsedEncodingUTF32LE),
7173
("test_FromContentOfFile",test_FromContentOfFile),
7274
("test_swiftStringUTF16", test_swiftStringUTF16),
7375
// This test takes forever on build servers; it has been seen up to 1852.084 seconds
@@ -334,6 +336,38 @@ class TestNSString : XCTestCase {
334336
}
335337
}
336338

339+
func test_FromContentsOfURLUsedEncodingUTF32BE() {
340+
guard let testFileURL = testBundle().url(forResource: "NSString-UTF32-BE-data", withExtension: "txt") else {
341+
XCTFail("URL for NSString-UTF32-BE-data.txt is nil")
342+
return
343+
}
344+
345+
do {
346+
var encoding: UInt = 0
347+
let string = try NSString(contentsOf: testFileURL, usedEncoding: &encoding)
348+
XCTAssertEqual(string, "NSString fromURL usedEncoding test with UTF32 BE file", "Wrong result when reading UTF32BE file")
349+
XCTAssertEqual(encoding, String.Encoding.utf32BigEndian.rawValue, "Wrong encoding detected from UTF32BE file")
350+
} catch {
351+
XCTFail("Unable to init NSString from contentOf:usedEncoding:")
352+
}
353+
}
354+
355+
func test_FromContentsOfURLUsedEncodingUTF32LE() {
356+
guard let testFileURL = testBundle().url(forResource: "NSString-UTF32-LE-data", withExtension: "txt") else {
357+
XCTFail("URL for NSString-UTF32-LE-data.txt is nil")
358+
return
359+
}
360+
361+
do {
362+
var encoding: UInt = 0
363+
let string = try NSString(contentsOf: testFileURL, usedEncoding: &encoding)
364+
XCTAssertEqual(string, "NSString fromURL usedEncoding test with UTF32 LE file", "Wrong result when reading UTF32LE file")
365+
XCTAssertEqual(encoding, String.Encoding.utf32LittleEndian.rawValue, "Wrong encoding detected from UTF32LE file")
366+
} catch {
367+
XCTFail("Unable to init NSString from contentOf:usedEncoding:")
368+
}
369+
}
370+
337371
func test_FromContentOfFile() {
338372
let testFilePath = testBundle().path(forResource: "NSStringTestData", ofType: "txt")
339373
XCTAssertNotNil(testFilePath)

build.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,8 @@
469469
'TestFoundation/Resources/NSStringTestData.txt',
470470
'TestFoundation/Resources/NSString-UTF16-BE-data.txt',
471471
'TestFoundation/Resources/NSString-UTF16-LE-data.txt',
472+
'TestFoundation/Resources/NSString-UTF32-BE-data.txt',
473+
'TestFoundation/Resources/NSString-UTF32-LE-data.txt',
472474
'TestFoundation/Resources/NSXMLDocumentTestData.xml',
473475
'TestFoundation/Resources/PropertyList-1.0.dtd',
474476
'TestFoundation/Resources/NSXMLDTDTestData.xml',

0 commit comments

Comments
 (0)