![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать код Юникодовского символа? [D7, WinXP]
Cara © (2004-08-08 13:27:00)Доброго дня.
Есть строка в юникоде.
Надо получить код для каждого её символа.
Пример:
?*(?/2+1) - строка в программе источнике (юникод).
При вставке в мою программу получаю ?*(?/2+1).
Я так понимаю,
что каждому символу соответствует
определённый код, и я смогу получив этот код сделать так:
---------
var
w : WideString;
iw : integer;
n_s : string;
begin
iw := ord(w);
if iw = 8242 then
begin
n_s := 'pi';
end;
---------
Примерно так.
Вопрос:
Как точно узнать код символа, выражение iw := ord(w);не работает, каждый раз выдаёт разное значение.
Бином Ньютоныч (2004-08-10 17:22:00) [1]IsWindowUnicode?
Cobalt (2004-08-10 16:11:00) [2]2 ZrenBy © (10.08.04 12:59) [10]
Вообще-то, тут не всё так ясно - ведь:
Remarks
This function causes a WM_GETTEXT message to be sent to the specified window or control.
И оконная функция заполняет этот буфер(? который уже потом трактуется (или преобразуется? но по каким правилам?) как PWideChar?) своим текстом. Который записывается в окно тоже как буфер:
BOOL SetWindowText(
HWND hWnd, // handle of window or control
LPCTSTR lpString // address of string
);
Remarks
The SetWindowText function causes a WM_SETTEXT message to be sent to the specified window or control. If the window is a list box control created with the WS_CAPTION style, however, SetWindowText sets the text for the control, not for the list box entries.
ZrenBy (2004-08-10 12:59:00) [3]GetWindowTextLength W
GetWindowText W
?
Cobalt (2004-08-09 23:19:00) [4]А вот это уже вопрос - что ты получаешь - Юникод или нет.
Ты буфер проверял? (то есть что на самом деле лежит в памяти)
Может, тебе в ANSI выдаёт - сталкивался, может быть, что кодировка текста зависит от раскладки - русская или не руссская. Копируешь из, например, Винампа текст с русскими буквами в Блокнот. И посмотрите - при активной русской раскладке в Винампе (при копировании) - текст, при английской - кракозябры.
Cara (2004-08-09 22:25:00) [5]Получаю так:
var
w : WideString;
begin
SetLength(w,SendMessage(h4,WM_GETTEXTLENGTH,0,0)+1);
SetLength(w,SendMessage(h4,WM_GETTEXT,Length(w),LPARAM(w)));
end;
И уже переменную (строку) - "w" пытаюсь разложить посимвольно, и получить коды этих символов.
В приложении откуда я забираю эту строку шрифт точно юникодовский.
Cobalt (2004-08-09 00:16:00) [6]Хм, странно
Вот мой пример - работает на ура - выдаёт одно и тоже значение(1069):
const MyString : WideString = '1 Это текст 2';
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(Ord(MyString[3])));
end;
Возникает вопрос - а точно ты получаешь строку в юникоде? Как получаешь?
Cara (2004-08-08 14:37:00) [7]Т.е. к символу. Я и так делал:
var
w : WideString;
iw,ic : integer;
n_s : string;
begin
ic := 1;
iw := ord(w[ic]);
if iw = 8242 then
begin
n_s := 'pi';
end;
Результат так же никакой.
Anatoly Podgoretsky (2004-08-08 14:26:00) [8]Обращаться к элементу строки.
Cara (2004-08-08 14:12:00) [9]Я про это слышал. Как поступать с WideString ?
Anatoly Podgoretsky (2004-08-08 13:59:00) [10]ord можно применять только к перечислимым типам, WideString относится к структурным.
Cara (2004-08-08 13:31:00) [11]Опять, там короче так:
pi*(i/2+1), только в юникоде.
Cara (2004-08-08 13:29:00) [12]Ну вот, началось. В вопросе стояло так -
Пример:
--
?*(?/2+1) - строка в программе источнике (юникод).
При вставке в мою программу получаю ?*(?/2+1).
--
При переносе из формы заполнения (при создании вопроса), произошло то же самое что и у меня в проге.