Win CE (Mobile 5.0), русский текст и UpperCase

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Tronix
новенький
Сообщения: 12
Зарегистрирован: 27.03.2009 18:04:33

Win CE (Mobile 5.0), русский текст и UpperCase

Сообщение Tronix »

Добрый день.

Пишу совсем простецкую прогу на последнем Lazarus, без KOL. Пишу для навигатора на Win Mobile 5.0.
Есть поле ввода Edit1, туда ввожу текст, например "москва", через экранную клавиатуру. И есть Label1, куда вывожу результат.
Делаю:

Код: Выделить всё

var
   TmpStr : UTF8String;
begin
   TmpStr := UTF8UpperCase(Edit1.Text);
   Label1.caption := TmpStr;


На Microsoft Device Emulator с WM50 - нормально, получаю текст в верхнем регистре как и хотел. На моем навигаторе -
нифига, текст как был в нижнем так и остался. Форум читал, уже пробовал и AnsiString, и WideString и WideUpperCase в различных вариациях - результата ноль. Как быть, куда копать, замучился уже.
Последний раз редактировалось Tronix 12.09.2011 18:52:43, всего редактировалось 1 раз.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Может TEdit.CharCase:=ecUppercase

кроме того могут проблемы с кодировкой, попробуй обычный AnsiUpperCase
http://lazarus-ccr.sourceforge.net/docs ... rcase.html
Tronix
новенький
Сообщения: 12
Зарегистрирован: 27.03.2009 18:04:33

Сообщение Tronix »

Ism писал(а):Может TEdit.CharCase:=ecUppercase


Попробовал. Опять таки на эмуляторе вводятся большие буквы в поле, на девайсе - маленькие o_O
Я конечно понимаю, что экранные клавиатуры немного разные, но ваще очень странно.
Ism писал(а):кроме того могут проблемы с кодировкой, попробуй обычный AnsiUpperCase
http://lazarus-ccr.sourceforge.net/docs ... rcase.html


Пробовал уже все что только можно, в различнейших комбинациях и вариациях, в том числе и AnsiUpperCase - на эмуляторе работает, на девайсе - нет.

Зачем вообще мне это? Искать вводимую подстроку в массиве строк. Например,у меня есть названия всех регионов России, в верхнем регистре. Я ввожу "мос" и нажимаю Enter. Я должен найти "Москву", "Московскую область".
Что интересно, когда я на девайсе переключаю экранную клаву в верхний регистр и ввожу "МОС", все работает. Функция POS() нормально ищет подстроку в строке и все гуд. То же самое и с маленькими буквами, например если ввести "мо" я нахожу "Приморский край", "Смоленская область".

Может как-то самому переводить в верхний регистр, с помощью какой-то своей функции? Я уже просто не знаю. Очень странный глюк.

Добавлено спустя 9 минут 42 секунды:
Сделал так:

Код: Выделить всё

var
   Str : AnsiString;
begin
   Str := AnsiUpperCase(Edit1.Text);
   Label1.Caption := Str;


Ввожу "мос". Выводит в Label "Унс" . Это на эмуляторе.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Ввожу "мос". Выводит в Label "Унс" . Это на эмуляторе.

Это признак неладов с кодировкой. Бывает трудно подобрать правильную комбинацию процедур кодирования и декодирования.
Возможно на девайсе работает какаято принудительная функция передачи строки. И смартфон блокирует все попытки изменить регистр. Кстати автодополнение или как там это называется в телефонах включено ?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Tronix я так понял, что у вас навигатор криво локализован и в системе просто нет таблицы сопоставления строчный и прописных букв для кириллицы.
Tronix
новенький
Сообщения: 12
Зарегистрирован: 27.03.2009 18:04:33

Сообщение Tronix »

Mr.Smart писал(а):Tronix я так понял, что у вас навигатор криво локализован и в системе просто нет таблицы сопоставления строчный и прописных букв для кириллицы.


Вполне возможно. Тогда подскажите, как все-таки перекодировать из маленьких букв в большие? Что-то беглый загугл не дал результатов по самописной функции UTF8UpperCase. Таблицы надо смотреть, да?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

В ручную. Задача тривиальная т.ч. алгоритм думаю изобретёте сами. Тем более сразу взялись разрабатывать под WinCE :wink:

ps Можно ещё посмотреть в сторону библиотеки iconv, но в данном случае лучше в ручную.
Tronix
новенький
Сообщения: 12
Зарегистрирован: 27.03.2009 18:04:33

Сообщение Tronix »

Mr.Smart писал(а):В ручную. Задача тривиальная т.ч. алгоритм думаю изобретёте сами. Тем более сразу взялись разрабатывать под WinCE :wink:


Да не совсем тривиально для меня. Вот есть у меня строка str : UTF8String. В ней слово "МОСКВА". Сделал:

Код: Выделить всё

For i := 1 to Length(str) do
      WriteLn(F,IntToStr(Ord(Str[i]))+'  - '+Str[i]);


Получил такую таблицу:

Код: Выделить всё

208  - ╨
156  - Ь
208  - ╨
158  - Ю
208  - ╨
161  - б
208  - ╨
154  - Ъ
208  - ╨
146  - Т
208  - ╨
144  - Р


Какая это кодировка? Не могу определить что это вообще. На UTF8 Cyrilic не похоже. Что это?

Извиняюсь, протупил, это и есть юникод кирилик. короче от кода маленькой буквы надо отнимать 32. Все теперь ясно, щаз буду пробовать.
Последний раз редактировалось Tronix 12.09.2011 16:02:56, всего редактировалось 1 раз.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Tronix - прочтите мат.часть http://ru.wikipedia.org/wiki/UTF-8
Tronix
новенький
Сообщения: 12
Зарегистрирован: 27.03.2009 18:04:33

Сообщение Tronix »

Спасибо всем, пришлось наваять такой костыль:

Код: Выделить всё

function MyUpperCase(s : String) : String;
var
    i, c : word;
begin
  If Length(s) <> 0 then
  begin
  i := 1;
  Repeat
        c := ord(s[i]);
        Case c of
        $d0:
            begin
               c := ord(s[i+1]);
               If c in [$b0..$bf] then
                  begin
                    Dec(c,32);
                    s[i+1] := chr(c);
                    Inc(i,2);
                    continue;
                  end;
            end;
        $d1:
            begin
               c := ord(s[i+1]);
               If c in [$80..$8f] then
                  begin
                    Inc(c,32);
                    s[i] := chr($d0);
                    s[i+1] := chr(c);
                    Inc(i,2);
                    continue;
                  end;
            end;
        end;
        Inc(i);
  Until i > length(s);
  end;
  MyUpperCase := s;
end;


Ну ладно, главное работает, и славно :) Спасибо всем еще раз.
Ответить