From f778d3416b6c0c993fccbde8702f57280576f700 Mon Sep 17 00:00:00 2001 From: Ray Chiang Date: Fri, 10 Nov 2017 13:34:45 +0800 Subject: Add support to unescape 👍 --- Foundation/GTMNSString+HTML.m | 20 ++++++++++++-------- Foundation/GTMNSString+HTMLTest.m | 2 ++ 2 files changed, 14 insertions(+), 8 deletions(-) (limited to 'Foundation') diff --git a/Foundation/GTMNSString+HTML.m b/Foundation/GTMNSString+HTML.m index 04ec23a..c35e760 100644 --- a/Foundation/GTMNSString+HTML.m +++ b/Foundation/GTMNSString+HTML.m @@ -486,12 +486,14 @@ static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) { NSScanner *scanner = [NSScanner scannerWithString:hexSequence]; unsigned value; if ([scanner scanHexInt:&value] && - value < USHRT_MAX && + value < INT_MAX && value > 0 && [scanner scanLocation] == length - 4) { - unichar uchar = (unichar)value; - NSString *charString = [NSString stringWithCharacters:&uchar length:1]; - [finalString replaceCharactersInRange:escapeRange withString:charString]; + value = NSSwapHostIntToLittle(value); + NSString *charString = [[NSString alloc] initWithBytes:&value length:sizeof(value) encoding:NSUTF32LittleEndianStringEncoding]; + if (charString) { + [finalString replaceCharactersInRange:escapeRange withString:charString]; + } } } else { @@ -500,12 +502,14 @@ static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) { NSScanner *scanner = [NSScanner scannerWithString:numberSequence]; int value; if ([scanner scanInt:&value] && - value < USHRT_MAX && + value < INT_MAX && value > 0 && [scanner scanLocation] == length - 3) { - unichar uchar = (unichar)value; - NSString *charString = [NSString stringWithCharacters:&uchar length:1]; - [finalString replaceCharactersInRange:escapeRange withString:charString]; + value = NSSwapHostIntToLittle(value); + NSString *charString = [[NSString alloc] initWithBytes:&value length:sizeof(value) encoding:NSUTF32LittleEndianStringEncoding]; + if (charString) { + [finalString replaceCharactersInRange:escapeRange withString:charString]; + } } } } else { diff --git a/Foundation/GTMNSString+HTMLTest.m b/Foundation/GTMNSString+HTMLTest.m index 52c7b6a..f6fb362 100644 --- a/Foundation/GTMNSString+HTMLTest.m +++ b/Foundation/GTMNSString+HTMLTest.m @@ -226,6 +226,8 @@ XCTAssertEqualObjects([@"<this & that>" gtm_stringByUnescapingFromHTML], @"", @"HTML unescaping failed"); + XCTAssertEqualObjects([@"👍" gtm_stringByUnescapingFromHTML], + @"👍", @"HTML unescaping failed"); } // testStringByUnescapingHTML -- cgit v1.2.3