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

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

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

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

Сообщение Tronix » 12.09.2011 13:28:52

Добрый день.

Пишу совсем простецкую прогу на последнем 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 раз.
Tronix
новенький
 
Сообщения: 12
Зарегистрирован: 27.03.2009 19:04:33

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

Сообщение Ism » 12.09.2011 13:37:34

Может TEdit.CharCase:=ecUppercase

кроме того могут проблемы с кодировкой, попробуй обычный AnsiUpperCase
http://lazarus-ccr.sourceforge.net/docs ... rcase.html
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение Tronix » 12.09.2011 13:53:58

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 "Унс" . Это на эмуляторе.
Tronix
новенький
 
Сообщения: 12
Зарегистрирован: 27.03.2009 19:04:33

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

Сообщение Ism » 12.09.2011 14:59:50

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

Это признак неладов с кодировкой. Бывает трудно подобрать правильную комбинацию процедур кодирования и декодирования.
Возможно на девайсе работает какаято принудительная функция передачи строки. И смартфон блокирует все попытки изменить регистр. Кстати автодополнение или как там это называется в телефонах включено ?
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

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

Сообщение Mr.Smart » 12.09.2011 15:24:09

Tronix я так понял, что у вас навигатор криво локализован и в системе просто нет таблицы сопоставления строчный и прописных букв для кириллицы.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Tronix » 12.09.2011 15:42:03

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


Вполне возможно. Тогда подскажите, как все-таки перекодировать из маленьких букв в большие? Что-то беглый загугл не дал результатов по самописной функции UTF8UpperCase. Таблицы надо смотреть, да?
Tronix
новенький
 
Сообщения: 12
Зарегистрирован: 27.03.2009 19:04:33

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

Сообщение Mr.Smart » 12.09.2011 15:46:27

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

ps Можно ещё посмотреть в сторону библиотеки iconv, но в данном случае лучше в ручную.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Tronix » 12.09.2011 15:58:47

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 раз.
Tronix
новенький
 
Сообщения: 12
Зарегистрирован: 27.03.2009 19:04:33

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

Сообщение Mr.Smart » 12.09.2011 16:01:07

Tronix - прочтите мат.часть http://ru.wikipedia.org/wiki/UTF-8
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Tronix » 12.09.2011 17:43:16

Спасибо всем, пришлось наваять такой костыль:
Код: Выделить всё
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;


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


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

Рейтинг@Mail.ru