0

で一意の文字を取得するにはどうすればよいNSStringですか?

私がやろうとしているのは、すべての不正な文字を入力して、どの文字NSStringが入力されたので削除する必要があるかをユーザーに確認できるようにすることです。有効な文字の を定義することから始めNSCharacterSet 、有効な文字が出現するたびにそれらを分離し、残ったもの (無効なもののみ) を新しい に結合しNSStringます。私は現在、新しい固有の文字を取得することを計画していますNSString(できれば配列として) が、参照がどこにも見つかりませんでした。

NSCharacterSet *legalCharacterSet = [NSCharacterSet
    characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789-()&+:;,'.# "];

NSString *illegalCharactersInTitle = [[self.titleTextField.text.noWhitespace
    componentsSeparatedByCharactersInSet:legalCharacterSet]
    componentsJoinedByString:@""];
4

3 に答える 3

2

それはあなたを助けるはずです。そのためのすぐに使用できる関数が見つかりませんでした。

NSMutableSet *uniqueCharacters = [NSMutableSet set];
NSMutableString *uniqueString = [NSMutableString string];
[illegalCharactersInTitle enumerateSubstringsInRange:NSMakeRange(0, illegalCharactersInTitle.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
    if (![uniqueCharacters containsObject:substring]) {
        [uniqueCharacters addObject:substring];
        [uniqueString appendString:substring];
    }
}];
于 2013-11-13T10:28:54.400 に答える
2

コードを次のように変更してみてください。

// legal set
NSCharacterSet *legalCharacterSet = [NSCharacterSet
                                         characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789-()&+:;,'.# "];

// test strings
NSString *myString = @"LegalStrin()";
//NSString *myString = @"francesco@gmail.com"; illegal string


NSMutableCharacterSet *stringSet = [NSCharacterSet characterSetWithCharactersInString:myString];
// inverts the set
NSCharacterSet *illegalCharacterSet = [legalCharacterSet invertedSet];

// intersection of the string set and the illegal set that modifies the mutable stringset itself
[stringSet formIntersectionWithCharacterSet:illegalCharacterSet];

// prints out the illegal characters with the convenience method
NSLog(@"IllegalStringSet: %@", [self stringForCharacterSet:stringSet]);

別のスタックオーバーフローの質問から印刷する方法を調整しました:

- (NSString*)stringForCharacterSet:(NSCharacterSet*)characterSet
{
    NSMutableString *toReturn = [@"" mutableCopy];
    unichar unicharBuffer[20];
    int index = 0;

    for (unichar uc = 0; uc < (0xFFFF); uc ++)
    {
        if ([characterSet characterIsMember:uc])
        {
            unicharBuffer[index] = uc;

            index ++;

            if (index == 20)
            {
                NSString * characters = [NSString stringWithCharacters:unicharBuffer length:index];
                [toReturn appendString:characters];

                index = 0;
            }
        }
    }

    if (index != 0)
    {
        NSString * characters = [NSString stringWithCharacters:unicharBuffer length:index];
        [toReturn appendString:characters];
    }
    return toReturn;
}
于 2013-11-13T10:33:05.873 に答える
0

まず第一に、キャラクターと見なすものに注意する必要があります。の APINSStringでは、Unicode が UTF-16 コード単位と呼ぶものについて話すときに文字という単語を使用しますが、コード単位を分離して扱うと、ユーザーが文字として考えるものはわかりません。たとえば、前の文字と組み合わせて別のグリフを生成する組み合わせ文字があります。また、サロゲート ペアもありますが、これはペアになっている場合にのみ意味があります。

その結果、ユーザーが文字と考えるものを含む部分文字列を実際に収集する必要があります。

Grzegorz Krukowski の回答に非常によく似たコードを書こうとしていました。彼は私を打ち負かしたので、私はしませんが、上記の理由により、正当な文字を除外するコードが壊れていることを追加します. たとえば、テキストに "é" が含まれていて、それが "e" と結合鋭アクセント記号として分解される場合、コードは "e" を削除し、ぶら下がっている結合鋭アクセント記号を残します。あなたの意図は、「é」を違法として扱うことだと思います。

于 2013-11-13T10:38:15.097 に答える