zoukankan      html  css  js  c++  java
  • 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] == '')
    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
  • 相关阅读:
    20110825 talk 1
    [原]spring学习笔记9.1.2Spring对Aop的概念性介绍
    [转]Servlet总结
    有关锁
    [转]java中hashcode()和equals()的详解
    转置
    [转]JNDI到底是什么,有什么作用
    前端(js/css/html)那些小的知识点,持续更新......
    积累的一些常用javascript函数
    25大实用的jQuery技巧和解决方案
  • 原文地址:https://www.cnblogs.com/qsl568/p/3793020.html
Copyright © 2011-2022 走看看