将NSString转换为不同的Charset

时间:2012-05-15 17:09:03

标签: ios cocoa character-encoding nsstring

我们正在为iOS5开发一个简单的usenet阅读器,实现NNTP协议。

不幸的是我们在编码时遇到了一些问题:标题可能如下所示:

Subject: Re: [GA] =?ISO-8859-15?Q?Pr=FCfungsmodus?= 
Date: 22 Apr 2012 22:50:38 +0200

在Objective-C中是否有一些简单的方法可以将包含=?ISO-8859-15?Q?Pr=FCfungsmodus?=的NSString转换为“Prüfungsmodus”?

由于

修改

嗯。我不确定我是否做对了: 你的意思是:

NSRange range = [input rangeOfString:@"=?"];
NSRange range2 = [input rangeOfString:@"?="];

NSString *string_to_decode = [input substringWithRange:NSMakeRange(range.location, range2.location-(range.location-2))];


NSData *data = [string_to_decode dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:YES];

NSString *converted = [[NSString alloc] initWithData:data encoding:(NSISOLatin1StringEncoding)];

因为那不起作用..

EDIT2 试图转换原始字节:

uint8_t buffer[1024];
iStream read:buffer maxLength:sizeof(buffer)
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSISOLatin1StringEncoding];

无论我在这里选择哪种编码,Subject:字段总是看起来一样(日语等编码除外...)

1 个答案:

答案 0 :(得分:0)

如果您是从第一原则开始自己做的,那就是大纲:

  • 从网络中读取字节
  • 确定特定编码中每次运行的范围 - 在您的示例中,您正在寻找=?...?= sections [这看起来像MIME字编码] - 对于每个范围,您需要字节指针,长度,编码[可能是字符集和单独的编码样式,这里看起来像带有Q编码的ISO-8859-15]
  • 使用NSString

  • 为每个人创建- (id)initWithBytes:(const void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding
  • 串连

  • 您还需要处理输入中的其他转义序列,例如当输入包含文字=?

关于MIME的详细信息,请查看维基百科。

[编辑:添加了关于MIME的说明。]