Как закодировать строку иврита (NSString) в формат Unicode для отправки в качестве URL-адреса в Objective-C - PullRequest
0 голосов
/ 24 августа 2010

Название в значительной степени подводит итог.У меня есть строка, содержащая иврит, используемая в NSUrl:

NSString * urlS = @"http://irrelevanttoyourinterests/some.aspx?foo=bar&this=that&Text=תל אביב"

. Я хочу преобразовать в:

Text=%u05EA%u05DC%20%u05D0%u05d1%u05d9%u05d1

и затем отправить ее как запрос GET.Я безуспешно перепробовал многие методы кодирования, и в конце концов попытался статически вставить закодированную строку в URL, указанный выше.

NSURL *url1 = [NSURL URLWithString:urlS];

Затем я использую startAsyncLoad, с которым вы, возможно, знакомы ( здесь ), но когда URL-адрес ограничен статической строкой Unicode, ничего не отправляется (проверяется с помощью Wireshark), хотя, если я использую следующую строку перед startAsyncLoad, который он отправляет (конечно, неправильно закодирован).

urlS = [urlS stringByAddingPercentEscapesUsingEncoding:NSWindowsCP1254StringEncoding];

Заранее спасибо.

1 Ответ

0 голосов
/ 25 августа 2010

Процентные значения, которые вы указали в качестве примера, являются кодовыми точками Unicode. Этот тип кодирования является нестандартным, поэтому я думаю, что вряд ли существует метод, который уже может это сделать. Возможно, вам придется бросить свой собственный, но это не так уж сложно.

В заголовке (возможно, под названием NSString+NonStandardPercentEscapes.h) введите следующее:

#import <Foundation/Foundation.h>

@interface NSString (NonStandardPercentEscapes)
- (NSString *) stringByAddingNonStandardPercentEscapes;
@end

И в исходном файле (возможно, под названием NSString+NonStandardPercentEscapes.m) поместите следующее:

#import "NSString+NonStandardPercentEscapes.h"

@implementation NSString (NonStandardPercentEscapes)

- (NSString *) stringByAddingNonStandardPercentEscapes
{
    NSCharacterSet *mustEscape = [NSCharacterSet characterSetWithCharactersInString:@"<>~\"{}|\\-`^% "];
    NSMutableString *result = [[NSMutableString alloc] init];

    NSUInteger length = [self length];
    unichar buffer[length];

    [self getCharacters:buffer range:NSMakeRange(0, length)];

    for (NSUInteger i = 0; i < length; i++)
    {
        if ([mustEscape characterIsMember:buffer[i]])
            [result appendFormat:@"%%%02hhx", buffer[i]];
        else if (buffer[i] > 0xFF)
            [result appendFormat:@"%%u%04hx", buffer[i]];
        else if (!isascii((int)buffer[i]))
            [result appendFormat:@"%%%02hhx", buffer[i]];
        else
            [result appendFormat:@"%c", buffer[i]];
    }

    // return the mutable version, nobody will know unless they check the class
    return [result autorelease];

    // alternatively, you can force the result to be immutable
    NSString *immutable = [[result copy] autorelease];
    [result release];
    return immutable;
}
@end

Затем, где бы вам ни понадобилось кодировать строку на иврите, вы можете сделать следующее (если ваш исходный файл содержит вышеуказанный заголовок):

NSString * urlS = @"http://irrelevanttoyourinterests/some.aspx?foo=bar&this=that&Text=תל אביב";
urlS = [urlS stringByAddingNonStandardPercentEscapes];

NSUrl *url1 = [NSURL URLWithString:urlS];

Отказ от ответственности:

Я понятия не имею, какие символы должны быть экранированы и в какой момент должно начинаться экранирование (это просто кодирует весь URL, что, вероятно, не то, что вам нужно), но приведенный выше код должен по крайней мере помочь вам.

...