Objective-C:将文件内容读入NSString对象不会转换unicode

时间:2011-08-19 07:39:43

标签: objective-c unicode nsstring escaping

我有一个文件,我正在使用stringWithContentsOfFile读入NSString对象。它包含日语字符的Unicode,例如:

\u305b\u3044\u3075\u304f

我认为是

せいふく

我希望我的NSString对象将字符串存储为后者,但它将它存储为前者。

我不太明白的是,当我这样做时:

NSString *myString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

它将其存储为:\ u305b \ u3044 \ u3075 \ u304f。

但是当我在字符串中硬编码时:

NSString *myString = @"\u305b\u3044\u3075\u304f";

它正确地将其转换并存储为:せいふく

stringWIthContentsOfFile是否以某种方式转义Unicode?任何帮助将不胜感激。

感谢。

3 个答案:

答案 0 :(得分:2)

文件\u305b\u3044\u3075\u304f只是普通字符。所以你要用字符串来获取它们。您需要在文件中保存实际的日文字符。也就是说,将せいふく存储在文件中,并将其加载到字符串中。

答案 1 :(得分:0)

Objective-C字符串中的\u305b之类的东西实际上是编译器的指令,用该字符的实际UTF-8字节序列替换它。读取文件的方法不是编译器,只读取它找到的字节。因此,要获得该字符(官方称为“代码点”),您的文件必须包含该字符的实际UTF-8字节序列,而不是符号表示\u305b

有点像\x43。在您的源代码中,这是四个字符,但它被一个值为0x43的字节替换。因此,如果您将@“\ x43”写入文件,该文件将不包含四个字符'\','x','4','3',它将包含单个字符'C'(其中包含ASCII)值0x43)。

答案 2 :(得分:0)

你可以试试这个,不知道它有多可行..

NSArray *unicodeArray = [stringFromFile componentsSeparatedByString:@"\\u"];
NSMutableString *finalString = [[NSMutableString alloc] initWithString:@""];
for (NSString *unicodeString in unicodeArray) {
    if (![unicodeString isEqualToString:@""]) {
        unichar codeValue;
        [[NSScanner scannerWithString:unicodeString] scanHexInt:&codeValue];
        NSString* betaString = [NSString stringWithCharacters:&codeValue length:1]; 
        [finalString appendString:betaString];
    }
} 
//finalString should have せいふく