2012-05-29 7 views
0

Я хочу использовать национальные символы польского языка для кодирования Base64. Например:Base64 и utf8/Кодирование национальных символов

"zażółć gęślą jaźń" 

Должно быть:

emEmIzM4MDvzJiMzMjI7JiMyNjM7IGcmIzI4MTsmIzM0NztsJiMyNjE7IGphJiMzNzg7JiMzMjQ7 

Но после реализации этого решения:

-(NSString *)Base64Encode:(NSData *)data{ 
    //Point to start of the data and set buffer sizes 
    int inLength = [data length]; 
    int outLength = ((((inLength * 4)/3)/4)*4) + (((inLength * 4)/3)%4 ? 4 : 0); 
    const char *inputBuffer = [data bytes]; 
    char *outputBuffer = malloc(outLength); 
    outputBuffer[outLength] = 0; 

    //64 digit code 
    static char Encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

    //start the count 
    int cycle = 0; 
    int inpos = 0; 
    int outpos = 0; 
    char temp; 

    //Pad the last to bytes, the outbuffer must always be a multiple of 4 
    outputBuffer[outLength-1] = '='; 
    outputBuffer[outLength-2] = '='; 


    while (inpos < inLength){ 
     switch (cycle) { 
      case 0: 
       outputBuffer[outpos++] = Encode[(inputBuffer[inpos]&0xFC)>>2]; 
       cycle = 1; 
       break; 
      case 1: 
       temp = (inputBuffer[inpos++]&0x03)<<4; 
       outputBuffer[outpos] = Encode[temp]; 
       cycle = 2; 
       break; 
      case 2: 
       outputBuffer[outpos++] = Encode[temp|(inputBuffer[inpos]&0xF0)>> 4]; 
       temp = (inputBuffer[inpos++]&0x0F)<<2; 
       outputBuffer[outpos] = Encode[temp]; 
       cycle = 3;     
       break; 
      case 3: 
       outputBuffer[outpos++] = Encode[temp|(inputBuffer[inpos]&0xC0)>>6]; 
       cycle = 4; 
       break; 
      case 4: 
       outputBuffer[outpos++] = Encode[inputBuffer[inpos++]&0x3f]; 
       cycle = 0; 
       break;       
      default: 
       cycle = 0; 
       break; 
     } 
    } 
    NSString *pictemp = [NSString stringWithUTF8String:outputBuffer]; 
    free(outputBuffer); 
    return pictemp; 
} 

конечно я получаю что-то немного другое:

emHFvMOzxYLEhyBnxJnFm2zEhSBqYcW6xYQ 

ведьма вернись ко мне (by onlin е decoder):

zażółć gęślą jaźń 

Я звоню это таким образом:

NSString* str= [email protected]"zażółć gęślą jaźń"; 
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding]; 

NSString * encodeString = [[[NSString alloc] init] autorelease]; 

encodeString = [self Base64Encode:data]; 

ответ

1

Интернет-декодер на ISO-8859-1 страницы, а не UTF-8. Если вы заставляете UTF-8, он работает.

Кроме того, разница в кодированной версии может быть связана с составленными или разложенными символами (не уверен).

+0

Теперь, когда я снова смотрю, это, вероятно, именно то, что разница. :) – Wevah

Смежные вопросы