NSString writeToFile с строкой в ​​кодировке URL - PullRequest
2 голосов
/ 31 марта 2011

У меня есть приложение Mac, которое хранит свой собственный файл журнала.Он добавляет информацию в файл, используя метод writeToFile от NSString.Он регистрирует URL-адреса веб-служб, с которыми он взаимодействует.Чтобы кодировать URL, я делаю это:

searchString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)searchString, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8 );

Затем приложение добавляет searchString к остальной части URL и записывает его в файл журнала.Теперь проблема в том, что после добавления этой строки кодировки URL, похоже, ничего не записывается в файл.Программа работает, как и ожидалось, в противном случае, однако.Удаление строки кода выше приводит к тому, что вся правильная информация записывается в файл (удаление этой строки не вариант, поскольку searchString должен быть закодирован URL-адресом).

О, и я использую NSUTF8StringEncoding при записи NSStringв файл.

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ: я знаю, что есть также функция, аналогичная CFURLCreateStringByAddingPercentEscapes в NSString, но я читал, что это не всегда работает.Может ли кто-нибудь пролить свет на это, если на мой первоначальный вопрос невозможно ответить?Спасибо!(РЕДАКТИРОВАТЬ: та же проблема возникает при использовании stringByAddingPercentEscapesUsingEncoding:)

РЕДАКТИРОВАТЬ 2: Вот код, который я использую для добавления сообщений в файл журнала.

+(void)logText:(NSString *)theString{
    NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory,NSUserDomainMask,YES) objectAtIndex:0];
    NSString *path = [docsDirectory stringByAppendingPathComponent:@"Folder/File.log"];
    NSString *fileContents = [[[NSString alloc] initWithContentsOfFile:path] autorelease];
    if([fileContents lengthOfBytesUsingEncoding:NSUTF8StringEncoding] >= 204800){
        fileContents = @"";
    }
    NSString *timeStamp = [[NSDate date] description];
    timeStamp = [timeStamp stringByAppendingString:@": "];
    timeStamp = [timeStamp stringByAppendingString:theString];
    fileContents = [fileContents stringByAppendingString:timeStamp];
    fileContents = [fileContents stringByAppendingString:@"\n"];
    [fileContents writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:NULL];
}

1 Ответ

1 голос
/ 01 апреля 2011

Поскольку после почти целого дня никто не предложил никаких ответов, я собираюсь опубликовать здесь дикое предположение: вы не случайно используете строку, которую хотите вывести (с символами процента в ней), в качестве формат строки ты?

То есть, совершив ошибку, сделав:

NSLog(@"In format strings you can use %@ as a placeholder for an object, and %i for a plain C integer.")

Вместо:

NSLog(@"%@", @"In format strings you can use %@ as a placeholder for an object, and %i for a plain C integer.");

Но я буду удивлен, если это окажется причиной вашей проблемы, так как обычно это приводит к случайному выводу, а не к абсолютному выводу. И в некоторых случаях Xcode также выдает предупреждения компилятора об этом (когда я пытался NSLog(myString), я получал «предупреждение: форматировать не строковый литерал и не форматировать аргументы»).

Так что не стреляйте в меня, если этот ответ не поможет. Было бы легче ответить на ваш вопрос, если бы вы могли показать нам больше вашего кода регистрации. Что касается предоставленной вами строки, я не могу обнаружить в ней ничего плохого.

Редактировать: Упс, я как-то упустил, что вы упомянули, что вы используете writeToFile:atomically:encoding:error: для записи строки в файл, так что даже более вероятно, что вы случайно обработаете ее как строку формата где-то. Но я собираюсь оставить этот ответ пока. Опять же, вы действительно должны показать нам больше своего кода, хотя ...

Редактировать: Что касается вашего вопроса о методе в NSString, который имеет аналогичные функции кодирования процентов, это будет stringByAddingPercentEscapesUsingEncoding:. Я не уверен, о каких проблемах вы думаете, когда говорите, что слышали, что это не всегда работает. Но одна вещь состоит в том, что CFURLCreateStringByAddingPercentEscapes позволяет вам указать дополнительные символы, которые обычно не должны быть экранированы, но которые вы все еще хотите экранировать, в то время как метод NSString не позволяет вам указать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...