Текущий архив: 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