Skip to content

Commit 18cafb1

Browse files
author
Mohit Athwani
committed
Added code to detect encoding in UTF32 files for NSString contestOfURL:usedEncoding:
This pull request is in continuation to PR swiftlang#893
1 parent d959640 commit 18cafb1

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
@@ -1301,12 +1301,18 @@ extension NSString {
13011301
let readResult = try NSData(contentsOf: url, options:[])
13021302

13031303
let bytePtr = readResult.bytes.bindMemory(to: UInt8.self, capacity:readResult.length)
1304-
if readResult.length >= 2 && bytePtr[0] == 254 && bytePtr[1] == 255 {
1304+
if readResult.length >= 4 && bytePtr[0] == 0xFF && bytePtr[1] == 0xFE && bytePtr[2] == 0x00 && bytePtr[3] == 0x00 {
1305+
enc?.pointee = String.Encoding.utf32LittleEndian.rawValue
1306+
}
1307+
else if readResult.length >= 2 && bytePtr[0] == 0xFE && bytePtr[1] == 0xFF {
13051308
enc?.pointee = String.Encoding.utf16BigEndian.rawValue
13061309
}
1307-
else if readResult.length >= 2 && bytePtr[0] == 255 && bytePtr[1] == 254 {
1310+
else if readResult.length >= 2 && bytePtr[0] == 0xFF && bytePtr[1] == 0xFE {
13081311
enc?.pointee = String.Encoding.utf16LittleEndian.rawValue
13091312
}
1313+
else if readResult.length >= 4 && bytePtr[0] == 0x00 && bytePtr[1] == 0x00 && bytePtr[2] == 0xFE && bytePtr[3] == 0xFF {
1314+
enc?.pointee = String.Encoding.utf32BigEndian.rawValue
1315+
}
13101316
else {
13111317
//Need to work on more conditions. This should be the default
13121318
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
@@ -462,6 +462,8 @@
462462
'TestFoundation/Resources/NSStringTestData.txt',
463463
'TestFoundation/Resources/NSString-UTF16-BE-data.txt',
464464
'TestFoundation/Resources/NSString-UTF16-LE-data.txt',
465+
'TestFoundation/Resources/NSString-UTF32-BE-data.txt',
466+
'TestFoundation/Resources/NSString-UTF32-LE-data.txt',
465467
'TestFoundation/Resources/NSXMLDocumentTestData.xml',
466468
'TestFoundation/Resources/PropertyList-1.0.dtd',
467469
'TestFoundation/Resources/NSXMLDTDTestData.xml',

0 commit comments

Comments
 (0)