【问题标题】:How to encode hebrew string (NSString) into a Unicode format in order to send as a URL in Objective-C如何将希伯来语字符串 (NSString) 编码为 Unicode 格式,以便在 Objective-C 中作为 URL 发送
【发布时间】:2011-04-03 03:46:50
【问题描述】:

标题几乎概括了它。我在 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 (here),但是当 URL 使用静态 Unicode 字符串压缩时,没有任何内容被发送(使用 Wireshark 检查),尽管如果我在 startAsyncLoad 之前使用以下行它发送(当然编码错误)。

urlS = [urlS stringByAddingPercentEscapesUsingEncoding:NSWindowsCP1254StringEncoding];

提前致谢。

【问题讨论】:

    标签: objective-c xcode unicode nsstring nsurl


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多