Почтовая кодировка IOS для ивритских символов

Мне нужно сделать HTTP-сообщение из моего приложения iPhone в документ google. Он отлично работает для английского языка, но иврит подходит как все???????? в документе google.

Это то, что я делаю:

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

Что мне не хватает?

EDIT: я попробовал предлагаемое решение здесь и посмотрел ссылку ahmedalkaf здесь, но не повезло.

4 ответа

Вариант 1

Вы установили свой Content-Type в application/x-www-form-urlencoded, но у вас не было URL-адреса вашего содержимого.

URL-кодирование вашего сообщения NSString и изменение кодировки на 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.


(В основном это объясняет, почему кодировка UTF-8 необходима для ASCII. Я не буду объяснять часть URL-кода этой проблемы, поскольку Тим Бодейт уже хорошо сделал.)

Основное Объяснение:

Кодирование ASCII содержит только символы с символом без символа, в то время как UTF-8 содержит символы для большинства языков.

Подробнее:

ASCII имеет только символы, показанные на изображении ниже, хотя он вписывается только в семь бит (или восемь, в зависимости от того, каким образом вы смотрите на него).

Однако как Unicode, так и UTF-8 могут содержать любые символы почти всех основных языков. UTF-8 является предпочтительным для Unicode, потому что, когда ваше приложение использует символы, которые находятся в ASCII (на английском языке), это будет только один байт. Когда ваше приложение использует иврит, строка будет на несколько байтов длиннее. Если вы используете Unicode, ваша строка будет ВСЕГДА иметь более одного байта, будь то на английском или иврите.

Решение? Просто измените все, что говорит ASCII на UTF8.

Вы (и каждый другой программист) должны абсолютно прочитать эту статью.

Это Джоэл Спольский (соучредитель Stack Exchange), и это очень полезно для любой программы, использующей строки, которые являются большинством программ. Вы особенно выиграете, если работаете с ивритом и английским языком.

Кстати, вы должны удалить теги iOS, iPhone, iPad и заменить его Objective-C, так как ваш фрагмент кода может также применяться к программированию для Mac.


Вы можете использовать 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 
[[********************************* sharedManager] setEnabled:YES]; 
[[********************************* 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]? добавить дополнительные поля в поля? или просто добавить


Для символов на иврите для публикации данных на сервере используется 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]];

licensed under cc by-sa 3.0 with attribution.