powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не работае upper
18 сообщений из 18, страница 1 из 1
Не работае upper
    #39193301
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Есть код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
static wchar_t *str_upper(wchar_t *s, const size_t len)
{
  wchar_t *c;
  const wchar_t *e;
  c = s;
  e = c + len;
  while (c < e) {
    *c = towupper(*c);
    c++;
  }
  return s;
}

int main() {
  wchar_t s[50] = L"'Дмитрий &#304;yi g&#252;nler\0";
  wchar_t *su = str_upper(s, wcslen(s));
  OutputDebugStringW(su);
  return 0;
}



Ожидаю увитеть:
Код: plaintext
ДМИТРИЙ İYI GÜNLER
, вижу:
Код: plaintext
Дмитрий IYI GuNLER

Как пофиксить?

PS. MinGW x32 Win
...
Рейтинг: 0 / 0
Не работае upper
    #39193337
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Как пофиксить?
Сначала читать внимательно https://msdn.microsoft.com/en-us/library/45119yx3.aspx
The case conversion of towupper is locale-specific. Only the characters relevant to
the current locale are changed in case.
А потом выкинуть эту ерунду и использовать LCMapString(LOCALE_INVARIANT).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не работае upper
    #39193347
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА потом выкинуть эту ерунду и использовать LCMapString(LOCALE_INVARIANT).

А она кросплатформенная?
...
Рейтинг: 0 / 0
Не работае upper
    #39193382
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__А она кросплатформенная?
Ты эта... Определись сначала: тебе нужна неработающая кроссплатформенная функция или
работающая не кроссплатформенная.
manIf wc is a lowercase wide character, and there exists an uppercase equivalent
in the current locale , it returns the uppercase equivalent of wc.
In all other cases, wc is returned unchanged.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не работае upper
    #39193597
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Авот я щас вам самое кросплатформенное напишу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
static wchar_t *str_upper(wchar_t *s, const size_t len)
{
  wchar_t *c;
  const wchar_t *e;
  c = s;
  e = c + len;
  while (c < e) {
    if (c<256){
     *c = towupper(*c);
    } else if (c== L"\u252"){
       c = ....;
    } else if (с==....
       .... 
       // тут тохренища кода но што поделать зато кросплатформенно-я-гарантирую
    }
    c++;
  }
  return s;
}
...
Рейтинг: 0 / 0
Не работае upper
    #39193905
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
на самом деле, ребяты, нужно всего лишь поставить нужный locale...
...
Рейтинг: 0 / 0
Не работае upper
    #39193929
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обломал.
...
Рейтинг: 0 / 0
Не работае upper
    #39193941
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не, это он так послал в весьма занимательное путешествие по полю с граблями разной
степени поражения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не работае upper
    #39193945
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверно вот этот ништячок поможет автору http://en.cppreference.com/w/cpp/locale/collate
...
Рейтинг: 0 / 0
Не работае upper
    #39194205
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boost.org/libs/locale

я использовал эту библиотеку в оригинальной версии (то есть в cppcms), очень рад был. она может слова считать например без ошибок (то есть на китайском тоже). переведет нормально в верхний регистр и так далее.. там и переводчик отличный есть.
...
Рейтинг: 0 / 0
Не работае upper
    #39194207
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какой смысл для китайцев несет upper-case?
...
Рейтинг: 0 / 0
Не работае upper
    #39194210
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА какой смысл для китайцев несет upper-case? гы :) это я просто как пример возможностей :)

кстати это наверное тоже важно - как upper case то, у чего нет upper case.. функция должна такое учитывать, если ты работаешь в utf (то есть ввод должне быть коректным и на китайском).
...
Рейтинг: 0 / 0
Не работае upper
    #39194419
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, локали уже корректно работают в gcc / mingw ??

ICU они вроде бы не прикрутили.
...
Рейтинг: 0 / 0
Не работае upper
    #39195148
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglА что, локали уже корректно работают в gcc / mingw ??

ICU они вроде бы не прикрутили. хм.. пользуюсь ими (в gcc) с... лет 15 :) думаю уже работают :)

icu и gcc не причем: его нет в стандарте. boost::locale использует icu , но есть какой-то другой бекенд.
...
Рейтинг: 0 / 0
Не работае upper
    #39196233
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер!

Вопрос по ICU, а функция u_toupper может вернуть строку длиннее, чем оригинальная?
...
Рейтинг: 0 / 0
Не работае upper
    #39196234
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. есть код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
static UChar *str_normalize(UChar *s, size_t *len, const bool AIsNormalize)
{
  size_t i, j = 0;
  UChar *ws = new UChar[*len * 2];
  UChar32 c;
  UBool isError;
  for (i = 0; i < *len;) {
    U16_NEXT(s, i, *len, c);
    if (!AIsNormalize || (AIsNormalize && u_isalnum(c))) {
      c = u_toupper(c);
      U16_APPEND(ws, j, *len * 2, c, isError);
    }
  }
  u_memcpy(s, ws, j);
  delete[] ws;
  s[j] = 0;
  *len = j;
  return s;
}



Надо промежуточный буффер увеличивать в размере до new UChar[*len * 2] или достаточно new UChar[*len]?
...
Рейтинг: 0 / 0
Не работае upper
    #39196237
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще по ICU:
Количество одинаковых символов считаем так:
Код: plaintext
1.
2.
3.
4.
5.
6.
  UChar *p, *q;
  const UChar *end1 = (UChar *)txt1 + len1;
  const UChar *end2 = (UChar *)txt2 + len2;
  size_t l, l1, l2;
  UChar32 c1, c2;
      for (l = 0; (p + l < end1) && (q + l < end2) && (p[l] == q[l]); l++);



или так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  UChar *p, *q;
  const UChar *end1 = (UChar *)txt1 + len1;
  const UChar *end2 = (UChar *)txt2 + len2;
  size_t l, l1, l2;
  UChar32 c1, c2;
      for (l = l1 = l2 = 0; (p + l1 < end1) && (q + l2 < end2);) {
        U16_NEXT(p, l1, len1, c1);
        U16_NEXT(q, l2, len2, c2);
        if (c1 == c2)
          l++;
        else
          break;
      }

?
...
Рейтинг: 0 / 0
Не работае upper
    #39196250
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__функция u_toupper может вернуть строку длиннее, чем оригинальная?

Может. Не вдвое, но всё равно - может.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не работае upper
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]