Я пытаюсь реализовать возможность поиска текста в файлах, которые нельзя загрузить в строку NSString.
Это относится к обычным двоичным файлам, но также и к допустимым текстовым файлам с кодировкой не-Unicodeдля которого я не могу предсказать кодировку, например, ISO Latin или MacRoman.
Я хочу найти любой текст, который пользователь может ввести в NSTextField, то есть мне нравится иметь возможность находить все, чтодопустимый текст Unicode на любом языке и в любом скрипте.
Единственное предположение, которое я делаю, заключается в том, что текст, который я хочу найти, использует кодировку UTF-8 (т.е. мне не нужно иметь дело с UTF-16).Если файл на самом деле закодирован в MacRoman, и я ищу не-ASCII-символы (набор 8-х бит), для этого не нужно искать совпадение.
Здесь я пытаюсь обойти то, что NSString можетне загружать некоторые «плохо» закодированные файлы, и я все еще хотел бы найти что-нибудь вокруг плохих символов.
Поиск должен быть нечувствителен к:
- case (высший приоритет)
- диакритические знаки (низкий приоритет)
- юникодная композиция (низкий приоритет)
Другая цель - быть быстрым.Это для утилиты поиска файлов, которая может просматривать тысячи больших файлов.
Так как я не могу загрузить данные в строку NSStt, мне нужно использовать другие API поиска.
Какие опции делаютЯ имею?Существуют ли библиотеки, которые могут это сделать, то есть найти текст, пропуская плохие символы?
(я думал, что мог бы использовать для этого предоставляемые системой функции regex
, но столкнулся бы с проблемой с этим тоже, хотя это не так серьезно).
Примечание: я пытался преобразовать такие данные в строку NSString с
[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]
и с
[NSString stringEncodingForData:data encodingOptions:@{
NSStringEncodingDetectionAllowLossyKey: @YES,
NSStringEncodingDetectionLossySubstitutionKey: @" ",
NSStringEncodingDetectionUseOnlySuggestedEncodingsKey: @YES,
NSStringEncodingDetectionSuggestedEncodingsKey: @[@(NSASCIIStringEncoding)]
}
convertedString:&text usedLossyConversion:nil
];
В то время как оба, кажется, сначала работают, это приводит к случайной панике ядра или другим серьезным сбоям, когда я вызываю -[NSString localizedStandardContainsString]
и подобные функции поиска.Когда он не падает, он работает довольно хорошо.
Эти сбои появляются на моем 10.13.6, чего мне достаточно, чтобы избежать этой техники, даже если Apple исправила это в 10.14.3.