NSFileManager contentsOfDirectoryAtPath проблема кодирования с путем samba - PullRequest
2 голосов
/ 06 ноября 2010

я монтирую путь SMB, используя этот код

urlStringOfVolumeToMount = [urlStringOfVolumeToMount stringByAddingPercentEscapesUsingEncoding:NSMacOSRomanStringEncoding];
NSURL *urlOfVolumeToMount = [NSURL URLWithString:urlStringOfVolumeToMount];
FSVolumeRefNum returnRefNum;
FSMountServerVolumeSync( (CFURLRef)urlOfVolumeToMount, NULL, NULL, NULL, &returnRefNum, 0L);

Затем я получаю содержимое некоторых путей:

NSMutableArray *content = (NSMutableArray *)[[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:&error];

Моя проблема заключается в каждом пути в содержимом"массив, содержащий специальные символы (например, ü), дает мне 2 закодированных символа: ü становится u¨

, когда я регистрирую байты, используя:

[contentItem dataUsingEncoding:NSUTF8StringEncoding];

, он дает мне: 75cc88, что является75) и ¨ (cc88)

Что я ожидал, так это символ ü, закодированный в utf-8.В байтах это должно быть c3bc

Я пытался преобразовать свой путь, используя кодировку ISOLatin1, MacOSRoman ... но до тех пор, пока путь к контенту уже имеет 2 отдельных символа вместо одного для ü, любое преобразование даетЯ закодировал 2 символа ...

Если кто-то может помочь, спасибо

Моя конфигурация: локализована на французском языке и использует снежного барса.

Ответы [ 2 ]

0 голосов
/ 08 июля 2014

Ну, через четыре года я борюсь с тем же, но ради В в моем случае.
Потребовалось много времени, чтобы найти простое решение.

NSString имеет необходимый встроенный компаратор.

Сравнивать aString с anotherString, если исходить из массива, возвращенного NSFileManagers contentsOfDirectoryAtPath:, так же просто, как:
if( [aString compare:anotherString] == NSOrderedSame )

Метод сравнения обеспечивает преобразование обеих строк в сопоставимый канонический формат. По сути, делая их «если они выглядят одинаково, они одинаковы»

0 голосов
/ 07 ноября 2010
urlStringOfVolumeToMount = [urlStringOfVolumeToMount stringByAddingPercentEscapesUsingEncoding:NSMacOSRomanStringEncoding];

Если вам по какой-то причине не нужен MacRoman, вам, вероятно, следует использовать UTF-8 здесь.

NSMutableArray *content = (NSMutableArray *)[[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:&error];

Моя проблема в том, что каждый путь в массиве «content», содержащий специальные символы (например, ü), дает мне 2 закодированных символа: ü становится u¨

Вы ожидаете составных персонажей и получаете разложенные последовательности.

Поскольку вы получаете пути из файловой системы, это не проблема: имена путей правильны, когда вы их получаете, и если вы передаете их чему-то, что делает Unicode правильным, они будут отображаться также правильно.

...