我正在使用MD5功能和Base64编码生成用户密码(用于登录所用API的数据层)
我在javascript中完成了代码并且很好,但是在Objective C中,我对BOM很感兴趣
我的代码是:
NSString *str = [[NSString alloc]
initWithFormat:@"%@%@%@%d",
[auth uppercaseString],
[user uppercaseString],
[pwd uppercaseString],
totalDaysSince2000];
NSString *sourceString = [[NSString alloc] initWithFormat:@"%02x%02x%02x%@",
0xEF,
0xBB,
0xBF,
str];
NSString *strMd5 = [sourceString MD5];
NSData *sourceData = [strMd5 dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64EncodedString = [[sourceData base64EncodedString] autorelease];
Run Code Online (Sandbox Code Playgroud)
使用上面的代码我进入内存:
替代文字http://www.balexandre.com/temp/2010-04-06_1523.png
女巫不是我真正需要的......
我甚至尝试过
"%c%c%c%@", (char)239, (char)187, (char)191, str
Run Code Online (Sandbox Code Playgroud)
没有运气......
使用UTF8String不接缝自动附加BOM,如在C#中:-(
如何正确附加BOM?
使用 ZBar 扫描 QR 码时,该过程产生的字符串无法正确显示 unicode 字符。任何免费使用的二维码生成器(如http://qrcode.kaywa.com)将单词Márti编码为二维码将导致M??rti。
在其他 SO 问题 ( 1 , 2 ) 中,建议在结果字符串的开头嵌入 BOM,但这样做:
NSString *qrString = [NSString stringWithFormat:@"\xEF\xBB\xBF%@",symbol.data];
Run Code Online (Sandbox Code Playgroud)
或这个:
NSString *qrString = [[NSString alloc] initWithFormat:@"\357\273\277%@", symbol.data];
Run Code Online (Sandbox Code Playgroud)
导致了与亚洲性格相同的、有缺陷的结果。symbol.data是由 ZBar 提供的结果 NSString。
更新:根据 dda 的回答,解决方案如下:
NSString *qrString = symbol.data;
//look for misinterpreted acute characters and convert them to UTF-8
if ([qrString canBeConvertedToEncoding:NSShiftJISStringEncoding]) {
qrString = [NSString stringWithCString:[symbol.data cStringUsingEncoding: NSShiftJISStringEncoding] encoding:NSUTF8StringEncoding];
}
Run Code Online (Sandbox Code Playgroud)