Foundation_编码相互转化,数据转化

来源:互联网 发布:安卓编程类游戏 编辑:程序博客网 时间:2024/06/04 19:39

1.字典,数组,字符串、data之间的转化

/字典或者数组转化为nsstring    NSArray *arr = [NSArray arrayWithObject:@"1"];        NSString *str = [arr JSONString];               //数组或者字典转化为json串    NSArray *arr1 = [str objectFromJSONString];     //json串转化为字典或者数组        NSData *data = [arr1 JSONData];                 //把json串转化为nsdata    NSString *str1 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];                                                    //把NSdata转为为NSString    NSData *data1 = [str1 dataUsingEncoding:NSUTF8StringEncoding]; //把NSString转化为NSData    //二进制流转变为字符串    NSString *str=[[NSMutableString alloc] initWithData:self.receiveDataencoding:NSUTF8StringEncoding];    //转变其中的内容    str=[str stringByReplacingOccurrencesOfString:@"," withString:@",\n"];    str=[str stringByReplacingOccurrencesOfString:@"{" withString:@"{\n"];        str=[str stringByReplacingOccurrencesOfString:@"}" withString:@"\n}"];    NSLog(@"%@",str);    //把字符串再转变为二进制流    self.receiveData=[NSMutableData dataWithData:[str dataUsingEncoding:NSUTF8StringEncoding]];     //request转变为URL    NSURL *url=[request URL];    //URL转变为nsstring    NSString *str=[[url absoluteString] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];    NSLog(@"%@",str);    NSURL *url=[NSURL URLWithString:@"http://img3.xooimage.com/files/6/1/3/firefox-logo-200x200-19f78a.png"];    //网站转变为二进制流    NSMutableData *data=[NSMutableData dataWithContentsOfURL:url];    UIImage *image=[UIImage imageWithData:data]; //读取文件    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"xml"];    //文件转变为二进制流    NSData *data = [NSData dataWithContentsOfFile:filePath];//取出首字母NSString *name = [city objectForKey:@"name"];         NSString *firstStr=[name substringWithRange:NSMakeRange(0, 1)];//从一个字符串中直接取出数组 NSString *str = [NSString stringWithFormat:@"Norman,Stanley,Fletcher"];    NSArray *arr = [str componentsSeparatedByString:@","];    NSLog(@"arr = %@",arr);//转码  urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


2.客户端和服务器端编码转化

1、ios手机端通过后台获取含有中文时,出现乱码即:将获取到的GBK 编码的字符解析成正常的汉字方法://声明一个gbk编码类型 NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);//使用如下方法 将获取到的数据按照gbkEncoding的方式进行编码,结果将是正常的汉字NSString *zhuanHuanHouDeShuJu = [[NSString alloc] initWithData:huoQuDaoDeData encoding:gbkEncoding];例子:本次项目因为使用的是ASIFormDataRequest 工具类解析从后台获取的数据,所以,将ASIHTTPRequest.m文件中的如下方法:- (NSString *)responseString{    NSData *data = [self responseData];    if (!data) {        return nil;    }        return [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:[self responseEncoding]] autorelease];}替换为- (NSString *)responseString{    NSData *data = [self responseData];    if (!data) {        return nil;    }    //明确表示用 gbkEncoding 进行解码    NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);    return [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:gbkEncoding];}届时,我们再用下面这个方法请求或发送中文,都不会有问题了:// 本类的公共方法 用于通过指定的URL获取数据。+(NSString *)getStingbyHTTPURL2:(NSString *)url{    NSString *encodedURL = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];    ASIFormDataRequest *asiHttpRequest = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:encodedURL]];    NSStringEncoding enc =  CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF8);    [asiHttpRequest setStringEncoding:enc];    [asiHttpRequest startSynchronous];    asiHttpRequest.delegate = self;    NSString *strResult = [asiHttpRequest responseString];   //以上的修改就是为了这句    return strResult;    }参考:    http://blog.sina.com.cn/s/blog_9e8867eb01013gbe.html从 GBK 转到 UTF-8   (上面的例子可作为一个成功案例)用 NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000) ,然后就可以用initWithData:encoding来实现。从 UTF-8 转到 GBKCFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000),得到的enc却是kCFStringEncodingInvalidId。没关系,试试 NSData *data=[nsstring dataUsingEncoding:-2147482063];
注意:必须使用kCFStringEncodingGB_18030_2000这个字符集,那个kCFStringEncodingGB_2312_80试了也不行。
成功案例: 将uif-8格式(xcode默认的)的字符串str_selectedLeiXing 转换为GBK格式的strGBK,如下所示:

    NSData *data = [str_selectedLeiXing dataUsingEncoding:-2147482063];

    NSString *strGBK = [[NSString alloc]initWithData:data encoding:-2147482063];

以上代码的实现,不需要添加任何附加开发包。

iphone之NSString, char, NSData相互转化1. NSString转化为UNICODE String:(NSString*)fname = @“Test”; char fnameStr[10];memcpy(fnameStr, [fname cStringUsingEncoding:NSUnicodeStringEncoding], 2*([fname length]));2. NSString转化为char(NSString*)fname = @“Test”;char fnameStr[10];fnameStr =[fname UTF8String];3. char -> NSData: 方法一:   charpostData = "TEST"   NSData *data = [NSData dataWithBytes:postData length:strlen(postData)]; 方法二:    转换为NSString: - (id)initWithUTF8String:(const char *)bytes
    然后用NSString的 - (NSData *)dataUsingEncoding:(NSStringEncoding)encoding4. NSData ->char  NSData returnData ;  char* bu=[returnData bytes];//使用下面两个方法,获取可以将一个nsstring 从gbk和utf8之间互转5. NSData->NSStringNSString* aStr;aStr = [[NSString alloc] initWithData:aData encoding:NSASCIIStringEncoding];6. NSString->NSDataNSData* aData;aData = [aStr dataUsingEncoding: NSASCIIStringEncoding];参考:http://blog.sina.com.cn/s/blog_4adf31ea0100t4y7.html

http://www.devdiv.com/article-1397-1.html
复制代码

 

问题延伸:

再开发有手机端的应用程序软件时,要保证3个方面的数据编码格式一致,他们分别是:

1、java 后台的编码格式。我们公司用的erlang开发,目前还没有实践过。

2、手机端的编码格式(ios 默认时utf-8)

3、服务器tomcat 端口的编码格式(tomcat 端口默认没有设置编码格式,所以,默认情况下它不支持utf-8 编码的汉字)

一般地,用ios开发手机端,都需要设置tomcat端口的编码格式为utf-8










0 0