今儿着实花了不少的时间来解决POST中文消息的问题. 调用OAMutableRequest的setHTTPBody方法设置中文后, 用fetcher时会产生一个错误. 经过长时间的debug, 最后终于发现是OAuthConsumer里的一个小的bug.
以下总结下原因:
我们假设要传送一个中文消息"使用OAuth发送博客", 我们需要:
NSString *string = @"使用OAuth发送博客";
NSData *body = [string dataUsingEncoding:NSUTF8StringEncoding]; //转换为NSData, utf8编码
[request setHTTPBody:body] //request是一个OAMutableURLRequest对象
[request setHTTPMethod:@"POST"]
在fetch时, OAMutableRequest需要调用_signatureBaseString方法来完成base string的准备工作. 在这中间, 他需要调用parameters这个方法. 问题就在这个方法中. 这个方法定义在类NSMutableURLRequest+Parameters.m中. 跟步调试的话, 我们会看到, 问题出在这句代码:
encodedParameters = [[NSString alloc] initWithData:[self HTTPBody] encoding:NSASCIIStringEncoding];
它将尝试将上面已经用utf8编码的内容用ascii编码读出来. 如果是中文字符串, 结果是nil, 如果是英文, 则不会有影响.
解决办法也很简单, 就是把这句中的NSASCIIStringEncoding改成NSUTF8StringEncoding
以下总结下原因:
我们假设要传送一个中文消息"使用OAuth发送博客", 我们需要:
NSString *string = @"使用OAuth发送博客";
NSData *body = [string dataUsingEncoding:NSUTF8StringEncoding]; //转换为NSData, utf8编码
[request setHTTPBody:body] //request是一个OAMutableURLRequest对象
[request setHTTPMethod:@"POST"]
在fetch时, OAMutableRequest需要调用_signatureBaseString方法来完成base string的准备工作. 在这中间, 他需要调用parameters这个方法. 问题就在这个方法中. 这个方法定义在类NSMutableURLRequest+Parameters.m中. 跟步调试的话, 我们会看到, 问题出在这句代码:
encodedParameters = [[NSString alloc] initWithData:[self HTTPBody] encoding:NSASCIIStringEncoding];
它将尝试将上面已经用utf8编码的内容用ascii编码读出来. 如果是中文字符串, 结果是nil, 如果是英文, 则不会有影响.
解决办法也很简单, 就是把这句中的NSASCIIStringEncoding改成NSUTF8StringEncoding