Как настроить UnicodeString :: caseCompare ICU (или получить тот же эффект) - PullRequest
0 голосов
/ 11 сентября 2018

Я не очень знаком с тем, как работают сравнения с учетом регистра и без учета регистра, и с ICU в целом.

Прямо сейчас у нас есть несколько методов, которые обертывают различные перегрузки в UnicodeString::caseCompare, и я хочу изменить их на что-то немного отличающееся: я хочу, чтобы точки и точки без точек сравнивались равными (независимо от регистра).

Я знаю, что ICU имеет API-интерфейс сопоставления, но я не уверен, как начать с точно таких же правил, как UnicodeString::caseCompare, и изменить его оттуда.

1 Ответ

0 голосов
/ 11 сентября 2018

Я не вижу способа сделать это с помощью класса C ++ UnicodeString.

Вы должны перейти к нижестоящим функциям string-as-an-array-of-UChars из unicode / ustring.h . В частности, u_strCaseCompare () - это, вероятно, то, что вам нужно, или u_strcasecmp () в сочетании с методом UnicodeString * getTerminationBuffer () .

Документация для опции U_FOLD_CASE_EXCLUDE_SPECIAL_I:

Используйте модифицированный набор отображений, предоставленный в CaseFolding.txt, для обработки точечных символов I и без точек I соответственно для тюркских языков (tr, az).

Я думаю , что означает рассматривать их как эквивалент.

Редактировать с фактическим тестированием:

#include <stdio.h>
#include <stdlib.h>
#include <unicode/ustring.h>
#include <unicode/stringoptions.h>

void comp(const char *a, const char *b) {
  UChar s1[10], s2[10];
  UErrorCode err = U_ZERO_ERROR;
  int32_t len1, len2;
  u_strFromUTF8(s1, 10, &len1, a, -1, &err);
  u_strFromUTF8(s2, 10, &len2, b, -1, &err);
  printf("%s <=> %s: %d (Without special i) %d (With special i)\n", a, b,
         u_strCaseCompare(s1, len1, s2, len2, 0, &err),
         u_strCaseCompare(s1, len1, s2, len2, U_FOLD_CASE_EXCLUDE_SPECIAL_I, &err));
}

int main(void) {
  const char *lc_dotted_i = "i";
  const char *lc_dotless_i = "\u0131";
  const char *uc_dotless_i = "I";
  const char *uc_dotted_i = "\u0130";

  comp(lc_dotted_i, lc_dotless_i);
  comp(uc_dotted_i, uc_dotless_i);
  comp(lc_dotted_i, uc_dotted_i);
  comp(lc_dotless_i, uc_dotless_i);
  comp(lc_dotted_i, uc_dotless_i);
  comp(lc_dotless_i, uc_dotted_i);
  return 0;
}

Результаты:

i <=> ı: -200 (Without special i) -200 (With special i)
İ <=> I: 1 (Without special i) -200 (With special i)
i <=> İ: -1 (Without special i) 0 (With special i)
ı <=> I: 200 (Without special i) 0 (With special i)
i <=> I: 0 (Without special i) -200 (With special i)
ı <=> İ: 200 (Without special i) 200 (With special i)
...