Лучший способ к символам ESC как новая строка и двойная кавычка в NSString

после еще нескольких копаний я нашел в исходном коде самого пожарного депо следующий класс / метод для генерации идентификатора:

export class AutoId {
  static newId(): string {
    // Alphanumeric characters
    const chars =
      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    let autoId = '';
    for (let i = 0; i < 20; i++) {
      autoId += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    assert(autoId.length === 20, 'Invalid auto ID: ' + autoId);
    return autoId;
  }
}

см .: https://github.com/firebase/ firebase-js-sdk / blob / 73a586c92afe3f39a844b2be86086fddb6877bb7 / packages / firestore / src / util / misc.ts # L36

Я извлек метод (кроме оператора assert) и поместил его в метод в моем код. Затем я использовал заданный метод транзакции, как показано ниже:

generateFirestoreId(){
        const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        let autoId = '';
        for (let i = 0; i < 20; i++) {
            autoId += chars.charAt(Math.floor(Math.random() * chars.length));
        }
        //assert(autoId.length === 20, 'Invalid auto ID: ' + autoId);
        return autoId;
    }

затем,

newDocRef = db.collection("PARENTCOLL").doc(PARENTDOCID).collection('SUBCOLL').doc(this.generateFirestoreId());
                        transaction.set(newDocRef,{
                            uid: userId,
                            name: name,
                            fsTimestamp: firebase.firestore.Timestamp.now(),
                        });

Поскольку я использую тот же алгоритм для генерации идентификатора, что и в самом пожарном депо, я чувствую себя лучше ,

Надеюсь, что это помогает / направляет кого-то.

Ура.

10
задан dreamlax 24 February 2009 в 03:30
поделиться

5 ответов

Я не думаю, что существует любой встроенный метод, чтобы "выйти" из определенного набора символов.

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

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

Если необходимо поддерживать переменный набор завершенных символов, смотреть на методы NSScanner "scanUpToCharactersFromSet:intoString": и "scanCharactersFromSet:intoString":. Вы могли использовать эти методы на NSScanner для выполнения круиза через строку, копируя части с раздела "scanUpTo" в изменяемую неизменную строку, и копируя части с конкретного набора символов только после выхода из них.

4
ответ дан 3 December 2019 в 20:06
поделиться

Вы могли бы даже хотеть изучить пользование regex библиотекой (существует много доступных опций, RegexKit является популярным выбором). Не должно быть слишком трудно найти, что предзаписанный regex выходит из строк, который обрабатывает особые случаи как существующие завершенные символы.

0
ответ дан 3 December 2019 в 20:06
поделиться

Это позволит избежать двойных кавычек в NSString:

NSString *escaped = [originalString stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];

Так что будьте осторожны и также избегайте escape-символа ...

4
ответ дан 3 December 2019 в 20:06
поделиться

stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding

5
ответ дан 3 December 2019 в 20:06
поделиться

Сделайте это:

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

Ссылка: http://simonwoodside.com/weblog/2009/4/22/how_to_really_url_encode/

1
ответ дан 3 December 2019 в 20:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: