OC下Base64编码的中文字符编码问题

Base64是常用的编码规范之一,如网络传输中应用广泛,之前列举过base64编码的原理:《base64举例》 以及java实现的base64编码工具类

这里,贴出OC下的base64代码,在平台之间通信过程中保证编码能通用——中间出现一个编码问题,google官方提供的base64Util包默认用的Utf-8编码,而中文之前统一用的gbk编码,以下代码修正了这个问题:

关键点:将CommonFunc的

base64StringFromText 和  textFromBase64String中的UTF8encoding改成gbkEncoding:

NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding];

改成

NSStringEncoding gbkEncoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

NSData *data = [text dataUsingEncoding:gbkEncoding];

//
//  CommonFunc.h
//  Base64Proj
//
//  Created by qslang on 14-6-12.
//  Copyright (c) 2014年 Dev. All rights reserved.

#import <Foundation/Foundation.h>

#define __BASE64( text )        [CommonFunc base64StringFromText:text]
#define __TEXT( base64 )        [CommonFunc textFromBase64String:base64]

@interface CommonFunc : NSObject

/******************************************************************************
 函数名称 : + (NSString *)base64StringFromText:(NSString *)text
 函数描述 : 将文本转换为base64格式字符串
 输入参数 : (NSString *)text    文本
 输出参数 : N/A
 返回参数 : (NSString *)    base64格式字符串
 备注信息 :
 ******************************************************************************/
+ (NSString *)base64StringFromText:(NSString *)text;

/******************************************************************************
 函数名称 : + (NSString *)textFromBase64String:(NSString *)base64
 函数描述 : 将base64格式字符串转换为文本
 输入参数 : (NSString *)base64  base64格式字符串
 输出参数 : N/A
 返回参数 : (NSString *)    文本
 备注信息 :
 ******************************************************************************/
+ (NSString *)textFromBase64String:(NSString *)base64;

@end

  

  1 //
  2 //  CommonFunc.m
  3 //  Base64Proj
  4 //
  5 //  Created by qslang on 14-6-12.
  6 //  Copyright (c) 2014年 Dev. All rights reserved.
  7 //
  8
  9 #import "CommonFunc.h"
 10
 11 //引入IOS自带密码库
 12 #import <CommonCrypto/CommonCryptor.h>
 13
 14 //空字符串
 15 #define     LocalStr_None           @""
 16
 17 static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 18
 19 @implementation CommonFunc
 20
 21 + (NSString *)base64StringFromText:(NSString *)text
 22 {
 23     if (text && ![text isEqualToString:LocalStr_None]) {
 24         NSStringEncoding gbkEncoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
 25
 26         //取项目的bundleIdentifier作为KEY  改动了此处
 27         //NSString *key = [[NSBundle mainBundle] bundleIdentifier];
 28         NSData *data = [text dataUsingEncoding:gbkEncoding];//NSUTF8StringEncoding
 29         //IOS 自带DES加密 Begin  改动了此处
 30         //data = [self DESEncrypt:data WithKey:key];
 31         //IOS 自带DES加密 End
 32         return [self base64EncodedStringFrom:data];
 33     }
 34     else {
 35         return LocalStr_None;
 36     }
 37 }
 38
 39 + (NSString *)textFromBase64String:(NSString *)base64
 40 {
 41     if (base64 && ![base64 isEqualToString:LocalStr_None]) {
 42         //取项目的bundleIdentifier作为KEY   改动了此处
 43         //NSString *key = [[NSBundle mainBundle] bundleIdentifier];
 44         NSData *data = [self dataWithBase64EncodedString:base64];
 45         //IOS 自带DES解密 Begin    改动了此处
 46         //data = [self DESDecrypt:data WithKey:key];
 47         //IOS 自带DES加密 End
 48         NSStringEncoding gbkEncoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
 49
 50         return [[NSString alloc] initWithData:data encoding:gbkEncoding];
 51     }
 52     else {
 53         return LocalStr_None;
 54     }
 55 }
 56
 57 /******************************************************************************
 58  函数名称 : + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key
 59  函数描述 : 文本数据进行DES加密
 60  输入参数 : (NSData *)data
 61  (NSString *)key
 62  输出参数 : N/A
 63  返回参数 : (NSData *)
 64  备注信息 : 此函数不可用于过长文本
 65  ******************************************************************************/
 66 + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key
 67 {
 68     char keyPtr[kCCKeySizeAES256+1];
 69     bzero(keyPtr, sizeof(keyPtr));
 70
 71     [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
 72
 73     NSUInteger dataLength = [data length];
 74
 75     size_t bufferSize = dataLength + kCCBlockSizeAES128;
 76     void *buffer = malloc(bufferSize);
 77
 78     size_t numBytesEncrypted = 0;
 79     CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
 80                                           kCCOptionPKCS7Padding | kCCOptionECBMode,
 81                                           keyPtr, kCCBlockSizeDES,
 82                                           NULL,
 83                                           [data bytes], dataLength,
 84                                           buffer, bufferSize,
 85                                           &numBytesEncrypted);
 86     if (cryptStatus == kCCSuccess) {
 87         return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
 88     }
 89
 90     free(buffer);
 91     return nil;
 92 }
 93
 94 /******************************************************************************
 95  函数名称 : + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key
 96  函数描述 : 文本数据进行DES解密
 97  输入参数 : (NSData *)data
 98  (NSString *)key
 99  输出参数 : N/A
100  返回参数 : (NSData *)
101  备注信息 : 此函数不可用于过长文本
102  ******************************************************************************/
103 + (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key
104 {
105     char keyPtr[kCCKeySizeAES256+1];
106     bzero(keyPtr, sizeof(keyPtr));
107
108     [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
109
110     NSUInteger dataLength = [data length];
111
112     size_t bufferSize = dataLength + kCCBlockSizeAES128;
113     void *buffer = malloc(bufferSize);
114
115     size_t numBytesDecrypted = 0;
116     CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,
117                                           kCCOptionPKCS7Padding | kCCOptionECBMode,
118                                           keyPtr, kCCBlockSizeDES,
119                                           NULL,
120                                           [data bytes], dataLength,
121                                           buffer, bufferSize,
122                                           &numBytesDecrypted);
123
124     if (cryptStatus == kCCSuccess) {
125         return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
126     }
127
128     free(buffer);
129     return nil;
130 }
131
132
133 /******************************************************************************
134  函数名称 : + (NSData *)dataWithBase64EncodedString:(NSString *)string
135  函数描述 : base64格式字符串转换为文本数据
136  输入参数 : (NSString *)string
137  输出参数 : N/A
138  返回参数 : (NSData *)
139  备注信息 :
140  ******************************************************************************/
141 + (NSData *)dataWithBase64EncodedString:(NSString *)string
142 {
143     if (string == nil)
144         [NSException raise:NSInvalidArgumentException format:nil];
145     if ([string length] == 0)
146         return [NSData data];
147
148     static char *decodingTable = NULL;
149     if (decodingTable == NULL)
150     {
151         decodingTable = malloc(256);
152         if (decodingTable == NULL)
153             return nil;
154         memset(decodingTable, CHAR_MAX, 256);
155         NSUInteger i;
156         for (i = 0; i < 64; i++)
157             decodingTable[(short)encodingTable[i]] = i;
158     }
159
160     const char *characters = [string cStringUsingEncoding:NSASCIIStringEncoding];
161     if (characters == NULL)     //  Not an ASCII string!
162         return nil;
163     char *bytes = malloc((([string length] + 3) / 4) * 3);
164     if (bytes == NULL)
165         return nil;
166     NSUInteger length = 0;
167
168     NSUInteger i = 0;
169     while (YES)
170     {
171         char buffer[4];
172         short bufferLength;
173         for (bufferLength = 0; bufferLength < 4; i++)
174         {
175             if (characters[i] == ‘\0‘)
176                 break;
177             if (isspace(characters[i]) || characters[i] == ‘=‘)
178                 continue;
179             buffer[bufferLength] = decodingTable[(short)characters[i]];
180             if (buffer[bufferLength++] == CHAR_MAX)      //  Illegal character!
181             {
182                 free(bytes);
183                 return nil;
184             }
185         }
186
187         if (bufferLength == 0)
188             break;
189         if (bufferLength == 1)      //  At least two characters are needed to produce one byte!
190         {
191             free(bytes);
192             return nil;
193         }
194
195         //  Decode the characters in the buffer to bytes.
196         bytes[length++] = (buffer[0] << 2) | (buffer[1] >> 4);
197         if (bufferLength > 2)
198             bytes[length++] = (buffer[1] << 4) | (buffer[2] >> 2);
199         if (bufferLength > 3)
200             bytes[length++] = (buffer[2] << 6) | buffer[3];
201     }
202
203     bytes = realloc(bytes, length);
204     return [NSData dataWithBytesNoCopy:bytes length:length];
205 }
206
207 + (NSString *)stringWithBase64EncodedString:(NSString *)string withEncoding:(NSStringEncoding)encoding
208 {
209     NSData *data = [self dataWithBase64EncodedString:string];
210     if (data)
211     {
212         return [[self alloc] initWithData:data encoding:encoding];
213     }
214     return nil;
215
216 }
217
218 //+ (NSString *)base64DecodedString:(NSStringEncoding)encoding
219 //{
220 //   //  return [self stringWithBase64EncodedString: withEncoding:encoding];
221 //    //data = [self DESEncrypt:data WithKey:key];
222 //
223 //}
224
225 /******************************************************************************
226  函数名称 : + (NSString *)base64EncodedStringFrom:(NSData *)data
227  函数描述 : 文本数据转换为base64格式字符串
228  输入参数 : (NSData *)data
229  输出参数 : N/A
230  返回参数 : (NSString *)
231  备注信息 :
232  ******************************************************************************/
233 + (NSString *)base64EncodedStringFrom:(NSData *)data
234 {
235     if ([data length] == 0)
236         return @"";
237
238     char *characters = malloc((([data length] + 2) / 3) * 4);
239     if (characters == NULL)
240         return nil;
241     NSUInteger length = 0;
242
243     NSUInteger i = 0;
244     while (i < [data length])
245     {
246         char buffer[3] = {0,0,0};
247         short bufferLength = 0;
248         while (bufferLength < 3 && i < [data length])
249             buffer[bufferLength++] = ((char *)[data bytes])[i++];
250
251         //  Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.
252         characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2];
253         characters[length++] = encodingTable[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];
254         if (bufferLength > 1)
255             characters[length++] = encodingTable[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];
256         else characters[length++] = ‘=‘;
257         if (bufferLength > 2)
258             characters[length++] = encodingTable[buffer[2] & 0x3F];
259         else characters[length++] = ‘=‘;
260     }
261
262     return [[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES];
263 }
264
265
266
267 @end

CommonFunc.m

调用代码:

        NSString *str1 = @"*&*我爱你中国";
        NSLog(@"baseStr=======%@",str1);
        NSString *encodes = [CommonFunc base64StringFromText:str1];
        NSLog(@"encodeStr=========%@",[CommonFunc base64StringFromText:str1]);
        NSLog(@"decodeStr========%@",[CommonFunc textFromBase64String:encodes]);

结果:

2014-06-17 16:04:19.275 Base64Proj[23496:303] baseStr=======*&*我爱你中国
2014-06-17 16:04:19.277 Base64Proj[23496:303] encodeStr=========KiYqztKwrsTj1tC5+g==
2014-06-17 16:04:19.278 Base64Proj[23496:303] decodeStr========*&*我爱你中国
Program ended with exit code: 0

OC下Base64编码的中文字符编码问题

时间: 2024-08-07 21:20:55

OC下Base64编码的中文字符编码问题的相关文章

JAVA中文字符编码问题

JAVA的中文字符乱码问题一直很让人头疼.特别是在WEB应用中.网上的分析文章和解决方案都很多,但总是针对某些特定情况的.很多次遇到乱码问 题后, 经过极为辛苦的调试和搜索资料后终于解决,满以为自己已经掌握了对付这些字符乱码怪兽的诀窍.可当过段时间,换了个应用或换了个环境,又会碰到那讨厌的火 星文,并再次无所适从.于是下决心好好整理一下中文字符编码问题,以方便自己记忆,也为其他程序员兄弟们提供一份参考. 首先要了解JAVA处理字符的原理.JAVA使用UNICODE来存储字符数据,处理字符时通常有

PHP解码unicode编码的中文字符

问题背景:晚上在抓取某网站数据,结果在数据包中发现了这么一串编码的数据:"......\u65b0\u6d6a\u5fae\u535a......www.jinyuanbao.cn", 这其实是中文被unicode编码后了的数据,我现在就是想解码出中文来,疯狂的google之后,发现很多人贴出了如下的函数,不过我发现根本不好使....如何解码unicode编码的字符?[好使] - PHP网站开发 - [开源与分享]每日最新博客在置顶博客之后: 如何解码unicode编码的字符?[好使]

刨根究底字符编码之九——字符编码方案的演变与字节序

字符编码方案的演变与字节序 一.字符编码方案的演变 1. 前文已经提及,编号字符集CCS(简称字符集)与字符编码方式CEF(简称编码方式)这两个概念,在早期并没有必要严格区分. 在Unicode编码方案出现之前,字符集及其具体的编码方式是绑定耦合在一起的,因此,"字符集"."编码"或"编码方式"甚至"编码方案"这几个概念经常相互指代.彼此混用. 比如,字符集里的字符编号(即码点编号)在很多文章里也称之为字符编码.字符码.码点.

python3中文字符编码问题

最近在进行网络爬虫时,被中文的编码问题搞得很头疼,特别是在windows环境下. 1.爬取到的中文网页内容,在解析时出现解析错误 一般情况下,我们都是用urllib中的相关函数,进行web页面的爬取,然后进行相关处理. 但是经常在处理中文web时,对文本内容的处理,经常出现一些编码错误. 为了彻底解决这个问题,一般是先编码再解码,但是还是会儿出现一些问题…… 后来,我的解决办法: 使用requests库,很好地支持非英文字符. import requests response = request

mysql 处理中文字符编码乱码

SELECT * FROM demo03; #设置表默认字符编码ALTER TABLE demo03 DEFAULT CHARACTER SET utf8;   INSERT INTO demo03(`id`,`username`)VALUES (6,'李四') #设置字段默认字符编码,保存中文ALTER TABLE `demo03` CHANGE  `name` `username`   VARCHAR(50) CHARACTER SET  utf8; #显示创建表的结构SHOW CREATE

中文字符编码

UTF-8和GBK等中文字符编码格式介绍及相互转换 UTF-8 GBK UTF8 GB2312 之间的区别和关系 字符编码详解

【字符编码】Java字符编码详细解答及问题探讨

一.前言 继上一篇写完字节编码内容后,现在分析在Java中各字符编码的问题,并且由这个问题,也引出了一个更有意思的问题,笔者也还没有找到这个问题的答案.也希望各位园友指点指点. 二.Java字符编码 直接上代码进行分析似乎更有感觉.   运行结果:   说明:通过结果我们知道如下信息. 1. 在Java中,中文在用ASCII码表示为3F,实际对应符号'?',用ISO-8859-1表示为3F,实际对应符号也是为'?',这意味着中文已经超出了ASCII和ISO-8859-1的表示范围. 2. UTF

字符串编码解析及字符编码输出

package 字符串编码解析; import java.io.UnsupportedEncodingException; public class Demo1 { public static void main(String[] args) throws UnsupportedEncodingException { String str = "中国"; //使用默认编码 byte[] gbk = str.getBytes("GBK"); //使用utf-8来编码

python读取中文字符编码问题

preface:许久没遇到过编码问题,一没注意就被绊倒脚了.. 一.编辑器是以ASICC编码格式的,若想在程序中有中文,需要改为utf-8格式,加入如下代码可破: <span style="font-size:18px;">import sys reload(sys) sys.setdefaultencoding('utf8') </span> 或者参考卤主转载的这篇http://blog.csdn.net/u010454729/article/details/