Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

SignUp Now!

Convert a given UTF8 NSRange in a string to a UTF16 NSRange

New member
Joined
Feb 6, 2023
Messages
6
Converting any given UTF8 NSRange in a string to a UTF16 NSRange

Examples:

Code:
let str = #"let πŸŽπŸ‡΅πŸ‡· = "hello world""#

//The UTF8 NSRange of πŸŽπŸ‡΅πŸ‡· is: {4, 12}
//The UTF16 NSRange of πŸŽπŸ‡΅πŸ‡· is: {4, 6}

//The UTF8 NSRange of let πŸŽπŸ‡΅πŸ‡· is: {0, 16}
//The UTF16 NSRange of let πŸŽπŸ‡΅πŸ‡· is: {0, 10}

Testing count:

Code:
print("πŸŽπŸ‡΅πŸ‡·".utf8.count) //12
print("πŸŽπŸ‡΅πŸ‡·".utf16.count) //6

print("let πŸŽπŸ‡΅πŸ‡·".utf8.count) //16
print("let πŸŽπŸ‡΅πŸ‡·".utf16.count) //10

I have only the UTF8 ranges, so what I need is to convert any of them to UTF16 range.
Thank you in advance.
 
New member
Joined
Feb 7, 2023
Messages
5
Similar to how you would use index(_:eek:ffsetBy:) to get the nth index when finding the nth character of a string, you can use the same method here, except on the UTF8View of the string.

Find both the start and end indices of the range as String.Index, then create a Range<String.Index>. Then you can create a NSRange from that.

Code:
let str = #"let πŸŽπŸ‡΅πŸ‡· = "hello world""#
let utf8Range = NSRange(location: 4, length: 12)
let startIndex = str.utf8.index(str.utf8.startIndex, offsetBy: utf8Range.lowerBound)
let endIndex = str.utf8.index(startIndex, offsetBy: utf8Range.length)
let stringRange = startIndex..<endIndex
let utf16Range = NSRange(stringRange, in: str)
print(utf16Range)
 
Top