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

问题描述 投票:6回答:5

我需要从我的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但没有运气。

objective-c http-post urlencode
5个回答
2
投票

Option 1

您已将Content-Type设置为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];

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

Option 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)。


3
投票

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

Basic Explanation:

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

Details:

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

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

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

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

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

顺便说一句,你应该删除标签iOS,iPhone,iPad,并用Objective-C替换它,因为你的代码片段也适用于Mac的编程。


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

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]是什么?在字段中添加一些额外的编码?或者只是追加


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) ?? ""
© www.soinside.com 2019 - 2024. All rights reserved.