用于希伯来字符的IOS HTTP Post编码

时间:2013-08-22 10:38:39

标签: objective-c http-post urlencode

我需要从我的iPhone应用程序到谷歌文档进行HTTP发布。它适用于英语,但希伯来语出现了所有????????在谷歌文档中。

这就是我正在做的事情:

NSString *post = [Util append:@"&entry.xxxxx=", self.firstName.text, @"&entry.yyyyyyy=", self.phone.text, @"&entry.zzzzzzzz=", self.email.text, nil];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"https://docs.google.com/forms/d/FORM_ID/formResponse"]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

NSHTTPURLResponse* urlResponse = nil;
NSError *error = [[NSError alloc] init];
[NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];

我错过了什么?

编辑:我尝试了here提供的解决方案并查看了ahmedalkaf的链接here,但没有运气。

5 个答案:

答案 0 :(得分:3)

(这主要解释了为什么需要UTF-8编码而不是ASCII。我不打算解释这个问题的URL编码部分,因为Tim Bodeit已经做得很好。)

基本说明:

ASCII编码仅包含英文,非重音字符,而UTF-8包含大多数语言的字符。

详细信息:

ASCII只有下面图片中显示的字符,虽然它只适合7位(或8位,具体取决于你看它的方式)。

ASCII Characters and how they are encoded. From the blog post by Joel Spolsky in the link below

但是,Unicode和UTF-8都可以包含几乎所有主要语言的任何字符。 UTF-8优于Unicode,因为当您的应用程序使用ASCII(英语)字符时,它只有一个字节。当您的应用使用希伯来语时,字符串将长几个字节。如果您使用Unicode,您的字符串将始终具有多个字节,无论是英文还是希伯来文。

解决方案?只需将说明ASCII的所有内容更改为UTF8。

你(以及其他所有程序员)绝对阅读this article

由Joel Spolsky(Stack Exchange的联合创始人)完成,它对使用字符串的任何程序都非常有益,这是大多数程序。如果您使用希伯来语和英语进行工作,您将特别受益。

顺便说一句,您应该删除iOS,iPhone,iPad标签,并将其替换为Objective-C,因为您的代码段也可以应用于Mac的编程。

答案 1 :(得分:2)

选项1

您已将内容类型设置为application/x-www-form-urlencoded,但尚未对内容进行网址编码。

对您的帖子NSString进行URL编码并将编码更改为UTF-8(我无法告诉您原因,但是需要使其工作)才能完成这项工作。

NSString *post = [Util append:@"&entry.xxxxx=", self.firstName.text, @"&entry.yyyyyyy=", self.phone.text, @"&entry.zzzzzzzz=", self.email.text, nil];
post =[post stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

其他一切都可以保持不变。但是,您应该考虑使用异步请求。使用同步请求时,您的用户界面将无响应,直到请求完成。异步请求不会发生这种情况。

选项2

对于HTTP请求,我通常使用ASIHTTPRequest库:http://allseeing-i.com/ASIHTTPRequest/

整合到您的项目中需要几分钟,但它使一切变得更加简单。你不必乱用编码等。

NSURL *url =[NSURL URLWithString:@"https://docs.google.com/forms/d/FORM_ID/formResponse"];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

[request addPostValue:self.firstName.text forKey:@"entry.xxxx"];
[request addPostValue:self.phone.text forKey:@"entry.yyyy"];
[request addPostValue:self.email.text forKey:@"entry.zzzz"];

[request startAsynchronous];

就是这样。

要设置ASIHTTPRequest,请按照以下说明http://allseeing-i.com/ASIHTTPRequest/Setup-instructions进行操作,并记住在项目设置 - >下的库文件中添加-fno-objc-arc编译器标志。构建阶段 - >如果您使用ARC,请编译源

答案 2 :(得分:1)

希伯来字符在服务器上使用NSUTF8StringEncoding发布数据


NSString *post = [Util append:@"&entry.xxxxx=", self.firstName.text, @"&entry.yyyyyyy=", self.phone.text, @"&entry.zzzzzzzz=", self.email.text, nil];
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

答案 3 :(得分:1)

您可以使用AFNetworking,这将以utf-8编码方式发送您的数据我将这个库用于我的西班牙语项目,并始终为áéóúñ获取正确的字符:

NSString *encodeUrl  = [@"document/d/Hphb4NsfxZLxTl7p3LMCWCpm9MCWskgoTFWzhP1Fpqap/edit" stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];  

//setup the post using AFHTTPClient  
AFHTTPClient *afHttpRequest = [[[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"https://docs.google.com"]] autorelease];  
NSURLRequest *request = [afHttpRequest requestWithMethod:@"POST" path:encodeUrl parameters:post];  

//loading indicator  
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];  
[[AFNetworkActivityIndicatorManager sharedManager] incrementActivityCount];  

[AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];  
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request  
    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON){  
        //some response  
    }  
    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON){  
        //the request fails  
    }  
];  
//fire the request  
[operation start]; 

[Util append]是什么?在字段中添加一些额外的编码?或者只是追加

答案 4 :(得分:0)

Swift 4解决包含希伯来语的字符串的方法

let dataString = "firstname=בני&lastname=דוידוביץ".addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) ?? ""

let urlString = "http://be.repoai.com:5080/WebRTCAppEE/streams/home/משדר_מיוחד_לכבוד_יום_הזעכרון_לחללי_מערכות_ישראל_ופעולות_האיבה.mp4".addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) ?? ""