iph*_*Pom 1 iphone post objective-c urlencode nsstring
我必须从Iphone应用程序将数据发布到php页面,所以我需要正确编码参数,转换特殊字符...
特别是我需要发送iPhone的UDID.
我在网上找到了许多帮助编码String作为参数传递,但我得到一个奇怪的错误.
我正在使用这个功能:
- (NSString *)URLEncodeString:(NSString *)string {
NSString *result =
(NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)string, NULL, CFSTR("'\"?=&+<>;:-"), kCFStringEncodingUTF8);
return [result autorelease];}
Run Code Online (Sandbox Code Playgroud)
它似乎是正确的,但当我使用它时,结果不是我所期望的.
这是代码:
UIDevice *device = [UIDevice currentDevice];
NSString *uniqueIdentifier = [device uniqueIdentifier];
NSLog(uniqueIdentifier);
NSLog([self URLEncodeString:uniqueIdentifier]);
Run Code Online (Sandbox Code Playgroud)
这是我点击此代码时生成的日志:
2010-06-23 21:58:51.671 provaNavigation[2343:20b] 00000000-0000-1000-8000-0013775CE6D2
2010-06-23 21:58:51.672 provaNavigation[2343:20b] 0000000010003900009080176010001273086780001283520013775CE6D2
Run Code Online (Sandbox Code Playgroud)
然后再次:
2010-06-23 21:59:25.614 provaNavigation[2343:20b] 00000000-0000-1000-8000-0013775CE6D2
2010-06-23 21:59:25.615 provaNavigation[2343:20b] 000000001000390000908192801000-18000912258750013775CE6D2
Run Code Online (Sandbox Code Playgroud)
然后再次:
2010-06-23 21:59:40.848 provaNavigation[2343:20b] 00000000-0000-1000-8000-0013775CE6D2
2010-06-23 21:59:40.849 provaNavigation[2343:20b] 000000001000390000908866081000-18000912239630013775CE6D2
Run Code Online (Sandbox Code Playgroud)
然后再次...
我每次都会获得不同的值,并且永远不会使用正确的%编号进行更正.
我之前遇到过URL编码问题,所以我最后在NSString上编写了一个类别来正确编码URL:
- (NSString *) URLEncodedString {
NSMutableString * output = [NSMutableString string];
const char * source = [self UTF8String];
int sourceLen = strlen(source);
for (int i = 0; i < sourceLen; ++i) {
const unsigned char thisChar = (const unsigned char)source[i];
if (thisChar == ' '){
[output appendString:@"+"];
} else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
(thisChar >= 'a' && thisChar <= 'z') ||
(thisChar >= 'A' && thisChar <= 'Z') ||
(thisChar >= '0' && thisChar <= '9')) {
[output appendFormat:@"%c", thisChar];
} else {
[output appendFormat:@"%%%02X", thisChar];
}
}
return output;
}
- (NSString *) URLDecodedString {
NSString * spacedDecoded = [self stringByReplacingOccurrencesOfString:@"+" withString:@" "];
return [spacedDecoded stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
Run Code Online (Sandbox Code Playgroud)
有几个关于此的说明:
这将正确编码unicode字符为多个八位字节.例如,我可以这样做:
NSString * enc = [@"http://example.com/?data=÷¡¿" URLEncodedString]; NSLog(@"%@", enc); NSLog(@"%@", [enc URLDecodedString]);
哪个会正确记录:
Testing.m:65 main() http%3A%2F%2Fexample.com%2F%3Fdata%3D%C3%B7%C2%A1%C2%BF Testing.m:66 main() http://example.com/?data=÷¡¿
编辑 我将其复制并粘贴到一个空项目中,如下所示:
NSString * string = @"00000000-0000-1000-8000-0013775CE6D2";
NSString *result = (NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, CFSTR("'\"?=&+<>;:-"), kCFStringEncodingUTF8);
NSLog(@"encode? %@", result);
result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"decode? %@", result);
NSLog(@"equal? %d", [string isEqual:result]);
Run Code Online (Sandbox Code Playgroud)
并记录:
Testing[62541:a0f] encode? 00000000%2D0000%2D1000%2D8000%2D0013775CE6D2
Testing[62541:a0f] decode? 00000000-0000-1000-8000-0013775CE6D2
Testing[62541:a0f] equal? 1
Run Code Online (Sandbox Code Playgroud)
您的代码无法正常工作的原因是因为您将字符串记录为格式字符串,这意味着它正在查看这些%2内容并尝试将其替换为其他内容.注意:
NSString * string = @"00000000-0000-1000-8000-0013775CE6D2";
NSString *result = (NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, CFSTR("'\"?=&+<>;:-"), kCFStringEncodingUTF8);
NSLog(@"%@", result);
NSLog(result);
Run Code Online (Sandbox Code Playgroud)
日志:
Testing[62585:a0f] 00000000%2D0000%2D1000%2D8000%2D0013775CE6D2
Testing[62585:a0f] 00000000879923200001897296640100041968968000 00013775CE6D2
Run Code Online (Sandbox Code Playgroud)
所以字符串被正确编码,但你只是错误地记录它.
| 归档时间: |
|
| 查看次数: |
959 次 |
| 最近记录: |