`
wjjxf
  • 浏览: 239438 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

解决NSData中非法utf-8字节的问题

阅读更多
     当用nsdata,按照utf8编码来初始化nsstring时,如果nsdata出现了非法utf-8编码,nsstring就回返回空,这不是我所期望的,对于非法的字节,可以用A代替。
    按照utf8格式标准,
U+00000000 - U+0000007F: 0 xxxxxxx 0x - 7x
U+00000080 - U+000007FF: 110 xxxxx 10 xxxxxx Cx 8x - Dx Bx
U+00000800 - U+0000FFFF: 1110 xxxx 10 xxxxxx 10 xxxxxx Ex 8x 8x - Ex Bx Bx
U+00010000 - U+001FFFFF: 11110 xxx 10 xxxxxx 10 xxxxxx 10 xxxxxx F0 8x 8x 8x - F7 Bx Bx Bx 很少用
U+00200000 - U+03FFFFFF: 111110 xx 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx F8 8x 8x 8x 8x - FB Bx Bx Bx Bx
U+04000000 - U+7FFFFFFF: 1111110 x 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx FC 8x 8x 8x 8x 8x - FD Bx Bx Bx Bx Bx
如果一个字节小于0x80,那么他就是一个字符,如果大于C0小于E0,表示有2个字节是utf8,第一个是110开头的,第二个是10开头的,如果大于E0小于F0,表示3个字节是utf8,第一个是1110开头的,第二个是10开头的,第三个是10开头的,如果不是表明非法,将非法的字节设置为A,即可。
    如何判断一个字节是否是110开头的或者是1110开头的呢?用b & 0xE0 == 0xC0,类推,判断是否是1110开头的,b&0xF0 == 0xE0。
  经过这一的转化,nsstring就能初始化了。
   代码如下:

                //将nsdata中的非法字符替换为A 0x41
		char aa[] = {'A','A','A','A','A','A'};
		NSMutableData *md = [NSMutableData dataWithData:data];
		int loc = 0;
		while(loc < [md length]){
			char buffer;
			[md getBytes:&buffer range:NSMakeRange(loc, 1)];
			//printf("%d", buffer&0x80);
			if((buffer & 0x80) == 0){
				loc++;
				continue;
			}else if((buffer & 0xE0) == 0xC0){
				loc++;
				[md getBytes:&buffer range:NSMakeRange(loc, 1)];
				if((buffer & 0xC0) == 0x80){
					loc++;
					continue;
				}
				loc--;
				//非法字符,将这1个字符替换为AA
				[md replaceBytesInRange:NSMakeRange(loc  , 1) withBytes:aa length:1];
				loc++;
				continue;
				
			}else if((buffer & 0xF0) == 0xE0){
				loc++;
				[md getBytes:&buffer range:NSMakeRange(loc, 1)];
				if((buffer & 0xC0) == 0x80){
					loc++;
					[md getBytes:&buffer range:NSMakeRange(loc, 1)];
					if((buffer & 0xC0) == 0x80){
						loc++;
						continue;
					}
					loc--;
				}
				loc--;
				//非法字符,将这个字符替换为A
				[md replaceBytesInRange:NSMakeRange(loc , 1) withBytes:aa length:1];
				loc++;
				continue;
				
			}else{
				[md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1];
				loc++;
				continue;
			}
		}
		//NSLog(@" new data =>%@", md);
		str = [[[NSString alloc] initWithData:md encoding:NSUTF8StringEncoding] autorelease];
分享到:
评论

相关推荐

    iOS 显示汉字的Unicode和UTF-8编码

    在iOS开发中,显示汉字涉及到了字符编码的重要概念,包括Unicode和UTF-8。这两个术语在计算机科学领域中是至关重要的,特别是在处理多语言文本时。让我们深入了解一下这两个概念及其在iOS中的应用。 首先,Unicode...

    NSData 与 NSString,Byte数组,UIImage 的相互转换

    - `+[NSData dataWithBytes:length:]`:提供`NSString`的UTF-8表示,使用`[string UTF8String]`获取字节数组,然后转换为`NSData`。 - `+[NSData dataUsingEncoding:]`:直接使用字符串的编码转换为`NSData`,如`...

    Xcode控制台把UTF8编码显示成中文

    标题"Xcode控制台把UTF8编码显示成中文"正是针对这一问题提供了解决方案。 首先,我们需要理解UTF8编码。UTF8是一种广泛使用的Unicode字符编码方案,它将每个字符编码为1至4个字节,能够表示几乎所有的Unicode字符...

    NSData扩展

    UTF-8是最常用的多字节编码标准,广泛应用于互联网上。 - `stringWithEncode:`:此方法允许开发者指定任何`NSStringEncoding`值,将`NSData`转换为相应的`NSString`。这在处理不同编码的文本数据时非常有用。 #### ...

    NSData+AESCrypt

    @interface NSData (AESCrypt) - (NSData *)AES256EncryptWithKey:(NSString *)key; - (NSData *)AES256DecryptWithKey:(NSString *)key; + (NSData *)dataWithBase64EncodedString:(NSString *)string; - (id)...

    iOS NSData 详细使用说明

    使用`NSKeyedArchiver`和`NSKeyedUnarchiver`,`NSData`可以方便地将复杂数据结构序列化为字节流,再存储到文件中,实现数据的持久化。 ### 四、注意事项 在使用`NSData`时,需要注意以下几点: - 在处理大量数据...

    NSData+AESCrypt库

    @interface NSData (AESCrypt) - (NSData *)AES256EncryptWithKey:(NSString *)key; - (NSData *)AES256DecryptWithKey:(NSString *)key; + (NSData *)dataWithBase64EncodedString:(NSString *)string; - (id)...

    ios demo,NSData和NSString之间的相互转换的源代码

    对于XML、JSON等数据交换格式,通常使用UTF-8编码。而在某些特定情况下,如与旧系统交互,可能需要使用其他编码,如ISO-8859-1。 在test_NSData_NSString这个demo中,可能包含了以下内容: - 示例代码展示了如何在...

    IOS应用源码——NSData.rar

    4. **数据转换**:NSData提供了将数据转换为其他类型的方法,如`UTF8String`可以将二进制数据转换为UTF-8编码的字符串,`base64EncodedStringWithOptions:`可以将数据编码为Base64格式的字符串。 5. **加密和解密**...

    swift-一行代码搞定NSString和NSData的md5加密

    在iOS应用开发中,我们可能需要对NSString(字符串)或NSData(二进制数据)进行MD5加密。标题提到的“一行代码搞定NSString和NSData的md5加密”意味着存在一个高效且简洁的方法来实现这个功能。 在Swift中,尽管...

    ios demo,NSData和NSDictionary之间的相互转换的实现案例

    在iOS开发中,NSData和NSDictionary是两种非常基础且重要的数据类型。NSData用于存储二进制数据,而NSDictionary则用于存储键值对的数据结构。在实际应用中,我们常常需要将这两种类型进行相互转换,以便于数据的...

    NSData+CommonCrypto

    在iOS和macOS开发中,`NSData`是用于处理二进制数据的主要类。这个`NSData+CommonCrypto`扩展提供了一种方便的方式来实现常见的加密和解密操作,这些操作是基于Apple的`CommonCrypto`库的。`CommonCrypto`是苹果提供...

    ios的NSString, char, NSData格式转化

    在上面的代码中,我们首先创建了一个NSString对象`fname`,然后使用`UTF8String`方法将其转化为char,并将结果存储在`fnameStr`数组中。 char 转化为 NSData 有时我们需要将char转化为NSData,以便在网络传输或...

    base64-utf8编码的NSString转化为NSString

    在解析xib文件的时候发现有的节点内容的编码是 base64-UTF8,其实这个节点内容的编码顺序是先将NSString转化为utf8格式的NSData,再将NSData通过base64加密。刚拿到这样的字符串的时候感觉有点绕,但是仔细分析下来...

    官网生成libzbar.a,代码完整,一分钟搞定扫码

    在`ZBarReaderController`的`imagePickerController:didFinishPickingMediaWithInfo:`方法中,找到解析结果的地方,确保转换字符串时指定为UTF-8编码,如: ```objc NSData *data = [result rawData]; NSString *...

    objective-c实现authCode 解决php与ios通信加密的问题 代码

    本文将深入探讨如何在Objective-C中实现`AuthCode`,以解决PHP和iOS之间的安全通信问题。 首先,我们需要了解`AuthCode`的基本概念。`AuthCode`通常是指一种基于特定算法对数据进行编码的方式,用于在网络通信中...

    NSData-Crypto:NSDataNSString 包装器中的 MD5、SHA1 和许多其他常见摘要方法

    NSData+加密 NSData+Crypto是一个 Mac 和 iOS 的NSData和NSString包装器,用于 CommonCrypto 框架的摘要方法。 包装了以下摘要函数: MD2 MD4 MD5 沙1 sha224 sha256 sha384 sha512 所有摘要函数都可用于...

    NSData与NSDictionary、JSON数据类型相互转换

    在iOS开发中,NSData是一个非常重要的数据类型,它能够存储任意二进制数据。在本文中,我们将探讨如何使用NSData与其他类型,特别是NSDictionary和JSON数据进行转换。 首先,NSData允许开发者将各种数据类型(如...

    NSData+Base64

    NSData+Base64类。提供两个方法。1. + (NSData *)dataFromBase64String:(NSString *)aString; 2. - (NSString *)base64EncodedString;

    WebP-UIImage:用于在 iOS 中处理 WebP 图像文件的 UIImage 类别

    用于在 iOS 中处理WebP图像文件的UIImage类别。 安装 将Classes文件夹和WebP.framework到您的项目中。 用法 开始使用WebP-UIImage很简单。 导入框架#import "UIImage+WebP.h"并调用以下方法: - ( NSData *)...

Global site tag (gtag.js) - Google Analytics