Merge pull request #928 from mohitathwani/String_used_encoding
diff --git a/Foundation/NSString.swift b/Foundation/NSString.swift
index 5b43cf5..351187d 100644
--- a/Foundation/NSString.swift
+++ b/Foundation/NSString.swift
@@ -1261,12 +1261,18 @@
let readResult = try NSData(contentsOf: url, options:[])
let bytePtr = readResult.bytes.bindMemory(to: UInt8.self, capacity:readResult.length)
- if readResult.length >= 2 && bytePtr[0] == 254 && bytePtr[1] == 255 {
+ if readResult.length >= 4 && bytePtr[0] == 0xFF && bytePtr[1] == 0xFE && bytePtr[2] == 0x00 && bytePtr[3] == 0x00 {
+ enc?.pointee = String.Encoding.utf32LittleEndian.rawValue
+ }
+ else if readResult.length >= 2 && bytePtr[0] == 0xFE && bytePtr[1] == 0xFF {
enc?.pointee = String.Encoding.utf16BigEndian.rawValue
}
- else if readResult.length >= 2 && bytePtr[0] == 255 && bytePtr[1] == 254 {
+ else if readResult.length >= 2 && bytePtr[0] == 0xFF && bytePtr[1] == 0xFE {
enc?.pointee = String.Encoding.utf16LittleEndian.rawValue
}
+ else if readResult.length >= 4 && bytePtr[0] == 0x00 && bytePtr[1] == 0x00 && bytePtr[2] == 0xFE && bytePtr[3] == 0xFF {
+ enc?.pointee = String.Encoding.utf32BigEndian.rawValue
+ }
else {
//Need to work on more conditions. This should be the default
enc?.pointee = String.Encoding.utf8.rawValue
diff --git a/TestFoundation/Resources/NSString-UTF32-BE-data.txt b/TestFoundation/Resources/NSString-UTF32-BE-data.txt
new file mode 100644
index 0000000..cbfab45
--- /dev/null
+++ b/TestFoundation/Resources/NSString-UTF32-BE-data.txt
Binary files differ
diff --git a/TestFoundation/Resources/NSString-UTF32-LE-data.txt b/TestFoundation/Resources/NSString-UTF32-LE-data.txt
new file mode 100644
index 0000000..d658a1f
--- /dev/null
+++ b/TestFoundation/Resources/NSString-UTF32-LE-data.txt
Binary files differ
diff --git a/TestFoundation/TestNSString.swift b/TestFoundation/TestNSString.swift
index 85dac2a..56e34fe 100644
--- a/TestFoundation/TestNSString.swift
+++ b/TestFoundation/TestNSString.swift
@@ -68,6 +68,8 @@
("test_FromContentsOfURL",test_FromContentsOfURL),
("test_FromContentsOfURLUsedEncodingUTF16BE", test_FromContentsOfURLUsedEncodingUTF16BE),
("test_FromContentsOfURLUsedEncodingUTF16LE", test_FromContentsOfURLUsedEncodingUTF16LE),
+ ("test_FromContentsOfURLUsedEncodingUTF32BE", test_FromContentsOfURLUsedEncodingUTF32BE),
+ ("test_FromContentsOfURLUsedEncodingUTF32LE", test_FromContentsOfURLUsedEncodingUTF32LE),
("test_FromContentOfFile",test_FromContentOfFile),
("test_swiftStringUTF16", test_swiftStringUTF16),
// This test takes forever on build servers; it has been seen up to 1852.084 seconds
@@ -334,6 +336,38 @@
}
}
+ func test_FromContentsOfURLUsedEncodingUTF32BE() {
+ guard let testFileURL = testBundle().url(forResource: "NSString-UTF32-BE-data", withExtension: "txt") else {
+ XCTFail("URL for NSString-UTF32-BE-data.txt is nil")
+ return
+ }
+
+ do {
+ var encoding: UInt = 0
+ let string = try NSString(contentsOf: testFileURL, usedEncoding: &encoding)
+ XCTAssertEqual(string, "NSString fromURL usedEncoding test with UTF32 BE file", "Wrong result when reading UTF32BE file")
+ XCTAssertEqual(encoding, String.Encoding.utf32BigEndian.rawValue, "Wrong encoding detected from UTF32BE file")
+ } catch {
+ XCTFail("Unable to init NSString from contentOf:usedEncoding:")
+ }
+ }
+
+ func test_FromContentsOfURLUsedEncodingUTF32LE() {
+ guard let testFileURL = testBundle().url(forResource: "NSString-UTF32-LE-data", withExtension: "txt") else {
+ XCTFail("URL for NSString-UTF32-LE-data.txt is nil")
+ return
+ }
+
+ do {
+ var encoding: UInt = 0
+ let string = try NSString(contentsOf: testFileURL, usedEncoding: &encoding)
+ XCTAssertEqual(string, "NSString fromURL usedEncoding test with UTF32 LE file", "Wrong result when reading UTF32LE file")
+ XCTAssertEqual(encoding, String.Encoding.utf32LittleEndian.rawValue, "Wrong encoding detected from UTF32LE file")
+ } catch {
+ XCTFail("Unable to init NSString from contentOf:usedEncoding:")
+ }
+ }
+
func test_FromContentOfFile() {
let testFilePath = testBundle().path(forResource: "NSStringTestData", ofType: "txt")
XCTAssertNotNil(testFilePath)
diff --git a/build.py b/build.py
index 1c0c080..4e34e37 100644
--- a/build.py
+++ b/build.py
@@ -469,6 +469,8 @@
'TestFoundation/Resources/NSStringTestData.txt',
'TestFoundation/Resources/NSString-UTF16-BE-data.txt',
'TestFoundation/Resources/NSString-UTF16-LE-data.txt',
+ 'TestFoundation/Resources/NSString-UTF32-BE-data.txt',
+ 'TestFoundation/Resources/NSString-UTF32-LE-data.txt',
'TestFoundation/Resources/NSXMLDocumentTestData.xml',
'TestFoundation/Resources/PropertyList-1.0.dtd',
'TestFoundation/Resources/NSXMLDTDTestData.xml',