Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

Как преобразовать "&#_1092;&#_1099;&#_1074;" в String.   Найти похожие ветки 

 
BlackTiger ©   (2004-05-12 14:12) [0]

(подчеркивания убрать!)

На входе я получаю данный String(!). Как бы его преобразовать в строку "фыв"?

Речь идет о веб-приложении.


 
Тимохов ©   (2004-05-12 14:14) [1]


> На входе я получаю данный String(!).

блин - это сказать сразу не судьба была.

по пунктам:
1. Сначала эту строку надо разобрать (думаю справитесь)
2. Получить unicode.
3. Воспользоваться widechartomultibyte

все.
делов на 10 минут.


 
BlackTiger ©   (2004-05-12 14:20) [2]

Ну нету такой функции WideCharToMultyByte!

Где ее искать-то?


 
Тимохов ©   (2004-05-12 14:25) [3]

где искать WideCharToMultyByte, я тоже не знаю, а WideCharToMultiByte находится в windows.pas.


 
BlackTiger ©   (2004-05-12 14:45) [4]

Я так и знал, что меня не понимают!!!

Дело в том, что у меня есть функция, которая НА ВХОДЕ ИМЕЕТ STRING (обыкновенный!!!). А содержимым этого string-а ЯВЛЯЕТСЯ "&#_1092;&#_1099;&#_1074;" (без подчеркиваний, есстественно).

И мне нужно преобразовать в string (стандартный!), содержаший "фыв".


 
Тимохов ©   (2004-05-12 14:52) [5]

наверное можно проще (жди Юрия Зотова - он точно знает).

я же тебе дал рабочий алгоритм.

тебя прекрасно понятно.

почитай в начале - 3 пункта.

там работы на 10 минут - давно написал бы.


 
Amoeba ©   (2004-05-12 14:53) [6]

MultiByteToWideChar?


 
BlackTiger ©   (2004-05-12 14:55) [7]

Вот пример (нерабочий) этой самой WideCharToMultiByte:


var
 s: string;
 l: integer;
 d: AnsiString;
begin
 s := "&#_1092;&#_1099;&#_1074;"; //ПОДЧЕРКИВАНИЯ УБРАТЬ!!!
 l := WideCharToMultiByte(CP_THREAD_ACP,
     WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
     @s[1], - 1, nil, 0, nil, nil);
 SetLength(d, l - 1);
 if l > 1 then begin
   WideCharToMultiByte(CP_THREAD_ACP,
     WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
     @s[1], - 1, @d[1], l - 1, nil, nil);
 end;
 ShowMessage(d);
end;


На выходе полная чушь, что и требовалось доказать.


 
Alx2 ©   (2004-05-12 15:09) [8]

Вот, если проще это, "по-кривому" деланный код:


Procedure TForm1.Button1Click(Sender: TObject);

 Function ToStr(Const S: String): String;

   Function Prepare: WideString;
   Var
     k, Start, Count: Integer;
   Begin
     SetLength(Result, Length(S));
     k := 1;
     Count := 0;
     While k <= Length(S) Do
       Begin
         While (k <= length(S)) And Not (S[k] In ["0".."9"]) Do
           inc(k);
         Start := k;
         While (k <= length(S)) And (S[k] In ["0".."9"]) Do
           inc(k);
         If Start < k Then
           Begin
             Word((@Result[Count + 1])^) := StrToInt(Copy(S, Start, k - Start));
             inc(Count);
           End;
       End;
     SetLength(Result, Count);
   End;

 Begin
   Result := WideCharToString(PWideChar(Prepare));
 End;

Begin
 ShowMessage(ToStr("&#_1092;&#_1099;&#_1074;"));
End;



 
Тимохов ©   (2004-05-12 15:10) [9]


> BlackTiger ©   (12.05.04 14:55) [7]

Блин, ты совсем тупой, что ли? Или читать не умеешь?

1. "&#_1092;&#_1099;&#_1074;" есть однобайтовое обозначение unicode строки, это НЕ кодировка.
2. Тебе нужно перевести это в реальный уникод, т.к. в строку типа widestring. Это элементарно - бежишь циклом по строке, все что между # считаешь символом, строку переводишь в число, число в символ widechar - типа widechar(2342). Обрати внимание на порядок байтов.
3. После этого полльзуйся функцией widechartomultibyte.


 
BlackTiger ©   (2004-05-12 15:42) [10]

Тимохов ©   (12.05.04 15:10) [9]

Базар фильтруй, да, "острый"!
Вопрос был в том, чтобы произвести все три действия одной стандартной функцией. А вот Ваш "WideCharToMultiByte" - это уже заключительный, да и не нужный этап.


 
Тимохов ©   (2004-05-12 15:47) [11]


> BlackTiger ©   (12.05.04 15:42) [10]

Чрезвычайно рад за вас, что вы наконец поняли свой вопрос.


> да и не нужный этап.

ну-ну
я посмотрю на вашу прогу, которая будет сидеть под аншийской виндой. Будет вам не "фыв", а "???".


 
Тимохов ©   (2004-05-12 15:51) [12]

добавлю, что такая "одна" функцию наверняка есть - дельфи же хранит как-то в dfm unicode. Я с dfm никогда особо не разбирался - потому одной такой функции не знаю.

Жди крутых - они точно знают ее.

ЗЫ. Давно бы сделал - делов на 10 минут, зато многое бы узнал.


 
Андрей Сенченко ©   (2004-05-14 13:49) [13]

А если эти три действия сделать одной, но нестандартной функцией - начальство премии не даст чтоли ?

Или просто есть желание найти функцию вида
MakePleaseAllWhatOWantToDo(WhatIWant)
?



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.052 c
7-1083182399
Mishenka
2004-04-28 23:59
2004.05.30
Очередь печати.


3-1083844364
kas
2004-05-06 15:52
2004.05.30
Как получить список MSSQL-серверов, зарегистрированных в сети


14-1083909758
stone
2004-05-07 10:02
2004.05.30
Без прав теперь не покататься. Даже на мопеде


1-1084215768
Idiliya
2004-05-10 23:02
2004.05.30
копмонент ValueListEditor - событие OnKeyPress


1-1085039941
Bocman
2004-05-20 11:59
2004.05.30
день и месяц из даты