8

我需要从我的 iPhone 应用程序到 Google Doc 做一个 HTTP Post。它适用于英语,但希伯来语在 Google Doc 中显示为问号。

这就是我正在做的事情:

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];

我错过了什么?

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

4

5 回答 5

3

选项1

您已将 Content-Type 设置为application/x-www-form-urlencoded,但尚未对内容进行 url 编码。

对您的帖子 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。

于 2013-08-28T07:35:13.380 回答
3

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

基本解释:

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

细节:

ASCII 仅包含下图中显示的字符,尽管它仅适合七位(或八位,取决于您查看它的方式)。

ASCII 字符及其编码方式。 来自 Joel Spolsky 在以下链接中的博客文章

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

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

您(和所有其他程序员)绝对应该阅读这篇文章

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

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

于 2013-08-30T21:13:32.993 回答
2

用于转义包含希伯来语的字符串的 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) ?? ""
于 2019-03-27T10:30:02.977 回答
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]];

于 2013-08-30T10:17:51.950 回答
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] 是什么?向字段添加一些额外的编码?或者只是附加

于 2013-08-31T00:18:03.227 回答