当用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...
- `+[NSData dataWithBytes:length:]`:提供`NSString`的UTF-8表示,使用`[string UTF8String]`获取字节数组,然后转换为`NSData`。 - `+[NSData dataUsingEncoding:]`:直接使用字符串的编码转换为`NSData`,如`...
标题"Xcode控制台把UTF8编码显示成中文"正是针对这一问题提供了解决方案。 首先,我们需要理解UTF8编码。UTF8是一种广泛使用的Unicode字符编码方案,它将每个字符编码为1至4个字节,能够表示几乎所有的Unicode字符...
UTF-8是最常用的多字节编码标准,广泛应用于互联网上。 - `stringWithEncode:`:此方法允许开发者指定任何`NSStringEncoding`值,将`NSData`转换为相应的`NSString`。这在处理不同编码的文本数据时非常有用。 #### ...
@interface NSData (AESCrypt) - (NSData *)AES256EncryptWithKey:(NSString *)key; - (NSData *)AES256DecryptWithKey:(NSString *)key; + (NSData *)dataWithBase64EncodedString:(NSString *)string; - (id)...
使用`NSKeyedArchiver`和`NSKeyedUnarchiver`,`NSData`可以方便地将复杂数据结构序列化为字节流,再存储到文件中,实现数据的持久化。 ### 四、注意事项 在使用`NSData`时,需要注意以下几点: - 在处理大量数据...
@interface NSData (AESCrypt) - (NSData *)AES256EncryptWithKey:(NSString *)key; - (NSData *)AES256DecryptWithKey:(NSString *)key; + (NSData *)dataWithBase64EncodedString:(NSString *)string; - (id)...
对于XML、JSON等数据交换格式,通常使用UTF-8编码。而在某些特定情况下,如与旧系统交互,可能需要使用其他编码,如ISO-8859-1。 在test_NSData_NSString这个demo中,可能包含了以下内容: - 示例代码展示了如何在...
4. **数据转换**:NSData提供了将数据转换为其他类型的方法,如`UTF8String`可以将二进制数据转换为UTF-8编码的字符串,`base64EncodedStringWithOptions:`可以将数据编码为Base64格式的字符串。 5. **加密和解密**...
在iOS应用开发中,我们可能需要对NSString(字符串)或NSData(二进制数据)进行MD5加密。标题提到的“一行代码搞定NSString和NSData的md5加密”意味着存在一个高效且简洁的方法来实现这个功能。 在Swift中,尽管...
在iOS开发中,NSData和NSDictionary是两种非常基础且重要的数据类型。NSData用于存储二进制数据,而NSDictionary则用于存储键值对的数据结构。在实际应用中,我们常常需要将这两种类型进行相互转换,以便于数据的...
在iOS开发中,NSData是一个非常重要的数据类型,它能够存储任意二进制数据。在本文中,我们将探讨如何使用NSData与其他类型,特别是NSDictionary和JSON数据进行转换。 首先,NSData允许开发者将各种数据类型(如...
在iOS和macOS开发中,`NSData`是用于处理二进制数据的主要类。这个`NSData+CommonCrypto`扩展提供了一种方便的方式来实现常见的加密和解密操作,这些操作是基于Apple的`CommonCrypto`库的。`CommonCrypto`是苹果提供...
在上面的代码中,我们首先创建了一个NSString对象`fname`,然后使用`UTF8String`方法将其转化为char,并将结果存储在`fnameStr`数组中。 char 转化为 NSData 有时我们需要将char转化为NSData,以便在网络传输或...
在解析xib文件的时候发现有的节点内容的编码是 base64-UTF8,其实这个节点内容的编码顺序是先将NSString转化为utf8格式的NSData,再将NSData通过base64加密。刚拿到这样的字符串的时候感觉有点绕,但是仔细分析下来...
在`ZBarReaderController`的`imagePickerController:didFinishPickingMediaWithInfo:`方法中,找到解析结果的地方,确保转换字符串时指定为UTF-8编码,如: ```objc NSData *data = [result rawData]; NSString *...
本文将深入探讨如何在Objective-C中实现`AuthCode`,以解决PHP和iOS之间的安全通信问题。 首先,我们需要了解`AuthCode`的基本概念。`AuthCode`通常是指一种基于特定算法对数据进行编码的方式,用于在网络通信中...
NSData+加密 NSData+Crypto是一个 Mac 和 iOS 的NSData和NSString包装器,用于 CommonCrypto 框架的摘要方法。 包装了以下摘要函数: MD2 MD4 MD5 沙1 sha224 sha256 sha384 sha512 所有摘要函数都可用于...
NSData+Base64类。提供两个方法。1. + (NSData *)dataFromBase64String:(NSString *)aString; 2. - (NSString *)base64EncodedString;
用于在 iOS 中处理WebP图像文件的UIImage类别。 安装 将Classes文件夹和WebP.framework到您的项目中。 用法 开始使用WebP-UIImage很简单。 导入框架#import "UIImage+WebP.h"并调用以下方法: - ( NSData *)...