Почему уChangeCharactersInRange могут быть разные символы, чем просто чтение текстового поля - PullRequest
0 голосов
/ 11 октября 2019

Мы используем shouldChangeCharactersInRange, чтобы подсчитать количество символов utf8 в нашем вводе с клавиатуры и ограничить его. Большинство графем состоит только из одной последовательности символов utf8, которая составляет 1-4 байта. Некоторые, например, с тонами кожи, имеют несколько последовательностей символов.

Один смайлик, женщина с черными волосами и маской, если мы введем его в окно редактирования и получим, что данные utf8 будут равны

f0 9f a6 b9 f0 9f 8f bb e2 80 8d ef b8 8f - четыре последовательности символов

Однако, когда передается в shouldChangeCharactersInRange, оно получается как

f0 9f a6 b9 f0 9f8f bb e2 80 8d ef b8 8f e2 99 80 - пять последовательностей символов

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

Если мывведите его несколько раз, после чего он будет продублирован как наборы из пяти последовательностей символов utf8 при передаче в функцию shouldChangeCharactersInRange, но женский идентификатор отсутствует, когда мы просто получаем строку UTF8 текстового поля.

Любые идеи, почему это водин, но не другой?

Эта функция делегата имеет дополнительный символ - возвращает 17 байтов / 5 последовательностей символов

-(BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
  const char * text= [string UTF8String];   
  int len=strlen((char*)text);
  NSLog(@"length %d", len);
  return YES;
}

// эта функция не содержит лишних символов - возвращает 14 байтов / 4 последовательности символов

-(int)readWindow:(char*)buffer
{
  const char * text = [newTextField.text UTF8String];       
  int len=strlen((char*)text);
  NSLog(@"length %d", len);
  return (0);
}

Спасибо

Шон

...