【问题标题】:Base64 and utf8 / National characters encodingBase64 和 utf8 / 国家字符编码
【发布时间】:2012-05-29 11:18:25
【问题描述】:

我想使用波兰国家字符来进行 Base64 编码。例如:

"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[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    //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

女巫回来了(在线decoder):

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

我是这样称呼它的:

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

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

encodeString = [self Base64Encode:data];

【问题讨论】:

    标签: objective-c ios base64


    【解决方案1】:

    在线解码器位于 ISO-8859-1 页面上,而不是 UTF-8。如果你强制使用 UTF-8,它可以工作。

    此外,编码版本的差异可能是因为组合字符与分解字符(不确定)。

    【讨论】:

    • 现在我再看一遍,这可能正是区别所在。 :)
    猜你喜欢
    • 2017-04-14
    • 2012-03-05
    • 2015-03-07
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    相关资源
    最近更新 更多