diff --git a/V2RayX/ConfigImporter.m b/V2RayX/ConfigImporter.m index b79c819..b3308a7 100644 --- a/V2RayX/ConfigImporter.m +++ b/V2RayX/ConfigImporter.m @@ -20,14 +20,96 @@ + (NSString* _Nonnull)decodeBase64String:(NSString*)encoded { } @try { NSData* decodedData = [[NSData alloc] initWithBase64EncodedString:fixed options:NSDataBase64DecodingIgnoreUnknownCharacters]; - NSString* decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding]; + // M1 12.6 (21G115) 版本转码结果nil 增加过滤 + NSData* resultDate = [[[ConfigImporter alloc]init] replaceNoUtf8:decodedData]; + NSString* decodedString = [[NSString alloc] initWithData:resultDate encoding:NSUTF8StringEncoding]; assert(decodedString != nil); return decodedString; } @catch (NSException *exception) { return @""; } } - +//替换非utf8字符 +//注意:如果是三字节utf-8,第二字节错误,则先替换第一字节内容(认为此字节误码为三字节utf8的头),然后判断剩下的两个字节是否非法; +- (NSData *)replaceNoUtf8:(NSData *)data +{ + char aa[] = {'A','A','A','A','A','A'}; //utf8最多6个字符,当前方法未使用 + NSMutableData *md = [NSMutableData dataWithData:data]; + int loc = 0; + while (loc < [md length]) + { + char buffer; + [md getBytes:&buffer range:NSMakeRange(loc, 1)]; + if ((buffer & 0x80) == 0) //0xxx xxxx 1个Byte + { + loc++; + continue; + } + else if ((buffer & 0xE0) == 0xC0) //110x xxxx 2个Byte + { + loc++; //此处可能越界,要判断 + if (loc >= md.length) { //此时的buffer已经是最后一个Byte + loc--; + //非法字符,将这个字符(一个byte)替换为A + [md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1]; + break; + } + [md getBytes:&buffer range:NSMakeRange(loc, 1)]; + if ((buffer & 0xC0) == 0x80) //10xx xxxx 第2个Byte + { + loc++; + continue; + } + loc--; + //非法字符,将这个字符(一个byte)替换为A + [md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1]; + loc++; + continue; + } + else if ((buffer & 0xF0) == 0xE0) //1110 xxxx 3个Byte + { + loc++; //此处可能越界,要判断 + if (loc >= md.length) { //此时的buffer已经是最后一个Byte + loc--; + //非法字符,将这个字符(一个byte)替换为A + [md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1]; + break; + } + [md getBytes:&buffer range:NSMakeRange(loc, 1)]; + if ((buffer & 0xC0) == 0x80) //10xx xxxx 第2个Byte + { + loc++; //此处可能越界,要判断 + if (loc >= md.length) { //此时的buffer已经是最后一个Byte + loc--; + //非法字符,将这个字符(一个byte)替换为A + [md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1]; + break; + } + [md getBytes:&buffer range:NSMakeRange(loc, 1)]; + if ((buffer & 0xC0) == 0x80) //10xx xxxx 第3个Byte + { + loc++; + continue; + } + loc--; + } + loc--; + //非法字符,将这个字符(一个byte)替换为A + [md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1]; + loc++; + continue; + } + else + { + //非法字符,将这个字符(一个byte)替换为A + [md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1]; + loc++; + continue; + } + } + + return md; +} + (NSDictionary*)parseLegacySSLink:(NSString*)link { //http://shadowsocks.org/en/config/quick-guide.html @try {