Главная страница
    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.48 MB
Время: 0.041 c
4-1082300345
Privet10
2004-04-18 18:59
2004.05.30
Как управлять PGP


6-1081932568
TButton
2004-04-14 12:49
2004.05.30
Как назначить обработчик события сокету


7-1083301755
_sulent
2004-04-30 09:09
2004.05.30
Вопрос по реестру


7-1082542124
DenK_vrtz
2004-04-21 14:08
2004.05.30
Как дать пользователю права администратора


14-1084450666
RealRascal
2004-05-13 16:17
2004.05.30
Загадка.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский