Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

Как преобразовать "&#_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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.034 c
14-1084036275
DillerXX
2004-05-08 21:11
2004.05.30
Колобот


1-1084640336
zep
2004-05-15 20:58
2004.05.30
MaskEdit и UpDown


6-1081314901
D.Z.
2004-04-07 09:15
2004.05.30
Дескриптор сокета в чужой программе.


3-1084046913
ser_ega
2004-05-09 00:08
2004.05.30
Database Desktop


14-1083828393
Slava
2004-05-06 11:26
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский