Цель-C: чтение содержимого файла в объект NSString не конвертирует юникод - PullRequest
1 голос
/ 19 августа 2011

У меня есть файл, который я читаю в объект NSString, используя stringWithContentsOfFile. Он содержит Unicode для японских символов, таких как:

\u305b\u3044\u3075\u304f

который я считаю

せいふく

Я бы хотел, чтобы мой объект NSString сохранял строку как последнюю, но он сохраняет ее как первую.

Я не совсем понимаю, что когда я делаю это:

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

Он хранится как: \ u305b \ u3075 \ u304f.

Но когда я жестко закодировал строку:

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

Он правильно конвертирует и сохраняет его как: せ い ふ く

Защищает ли stringWIthContentsOfFile от Unicode каким-либо образом? Любая помощь будет оценена.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 19 августа 2011

В файле \u305b\u3044\u3075\u304f просто нормальные символы. Таким образом, вы получаете их в строку. Вам нужно сохранить настоящие японские символы в файле. То есть, хранить せいふく в файле, и он будет загружен в строку.

0 голосов
/ 19 августа 2011

Вы можете попробовать это, не знаю, насколько это возможно ..

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 せいふく
0 голосов
/ 19 августа 2011

Что-то вроде \u305b в строке Objective-C на самом деле является инструкцией для компилятора , чтобы заменить его фактической байтовой последовательностью UTF-8 для этого символа.Метод чтения файла не является компилятором, а только читает найденные байты.Таким образом, чтобы получить этот символ (официально называемый «кодовой точкой»), ваш файл должен содержать действительную последовательность байтов UTF-8 для этого символа, а не символьное представление \u305b.

Это немного похоже на \x43.В исходном коде это четыре символа, но он заменяется одним байтом со значением 0x43.Таким образом, если вы напишите @ "\ x43" в файл, файл не будет содержать четыре символа '\', 'x', '4', '3', он будет содержать один символ 'C' (который имеет ASCIIзначение 0x43).

...