0

标题几乎概括了它。我在 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];

提前致谢。

4

1 回答 1

0

您作为示例给出的百分比转义是 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 进行编码,这可能不是你想要的),但上面的代码至少应该让你开始。

于 2010-08-25T01:17:42.760 回答