一些字符在NSString中发生了变化

Fab*_*ius 1 iphone objective-c character-encoding special-characters nsstring

我正在从url内容中检索字符串,这样:

NSString *urlStr = [NSString stringWithFormat:@"http://www.example.com/string_to_retrieve"];
NSURL *url = [NSURL URLWithString:urlStr];
NSString *resp = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:nil];
Run Code Online (Sandbox Code Playgroud)

并将其写入文件,这样:

NSString *outFile = @"/path/to/myfile";
[resp writeToFile:outFile atomically:YES encoding:NSUTF8StringEncoding error:nil];
Run Code Online (Sandbox Code Playgroud)

我的字符串包含几个特殊的字符,如"ö",应该用"F6"十六进制值表示,但是当我尝试用十六进制编辑器打开我的字符串写入的文件时,我看到"ö"(F6)被转换另外两个字符:""(C3 B6)

我尝试了两种其他的字符串编码

NSString *resp = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:nil];
Run Code Online (Sandbox Code Playgroud)

[resp writeToFile:outFile atomically:YES encoding:NSUTF8StringEncoding error:nil];
Run Code Online (Sandbox Code Playgroud)

但总是结果不好......

NSASCIIStringEncoding似乎是我可以从我的网址获取该字符串的唯一方法:如果我使用其他编码,就像NSUTF8StringEncoding我得到的那样nil

NSUTF8StringEncoding似乎是我可以写入我的文件的唯一方法:如果我使用其他编码,就像NSASCIIStringEncoding我得到的是一个0字节文件

那么我怎样才能正确检索并将该字符串写入我的文件?

Mar*_*n R 7

F6是,ö的字符代码NSISOLatin1StringEncoding,所以

[resp writeToFile:outFile atomically:YES encoding:NSISOLatin1StringEncoding error:nil];
Run Code Online (Sandbox Code Playgroud)

应该给出想要的结果.(NSISOLatin2StringEncoding也可以.我不确定差异.支持的编码的文档不是很冗长.)


更新:

  • NSISOLatin1StringEncodingISO-8859-1编码,适用于"西欧"语言.
  • NSISOLatin2StringEncodingISO-8859-2编码,适用于"东欧"语言.
  • @Esailija声明(见下面的评论)Windows-1252可能是更好的选择,相应的编码是NSWindowsCP1252StringEncoding.