Модератор: Модераторы
wofs писал(а):на досуге исходники
vitaly_l писал(а):wofs писал(а):на досуге исходники
tema в принципе правильное направление дал, т.к. можно открыть мнемоники в стандартном HTML-вьювере, который в лазарусе и потом взять оттуда уже текст в UTF-8, а не мнемоники. Конвертером из мнемоник в UTF-8 будет являться стандартный лазарусоовский HTML-вьювер (или хромовский гуугл).
.
function HTMLEntrToUTF8 (const S: WideString): WideString;
var W: WChar;
i,j,n,code: Integer;
begin
SetLength(result,length(S));
i:=1; j:=1;
while i<=length(S) do
begin
W:=WChar(S[i]);
if (Copy(S,i,2)='&#') then
begin
i:=i+2;
Val(Copy(S,i,4),n,code);
if code=0 then
i:=i+4
else
i:=i+code-1;
if S[i]=';' then Inc(i);
W:=WChar(n);
end
else
Inc(i);
result[j]:=W;
Inc(j);
end;
SetLength(result,j-1);
end;
wofs писал(а):sign писал(а):http://alexboiko.narod.ru/prod.html
В коде надо... Раздел Lazarus...
1040 - А 1041 - Б 1042 - В 1043 - Г 1044 - Д 1045 - Е 1046 - Ж 1047 - З 1048 - И 1049 - Й
1050 - К 1051 - Л 1052 - М 1053 - Н 1054 - О 1055 - П 1056 - Р 1057 - С 1058 - Т 1059 - У
1060 - Ф 1061 - Х 1062 - Ц 1063 - Ч 1064 - Ш 1065 - Щ 1066 - Ъ 1067 - Ы 1068 - Ь 1069 - Э
1070 - Ю 1071 - Я 1072 - а 1073 - б 1074 - в 1075 - г 1076 - д 1077 - е 1078 - ж 1079 - з
1080 - и 1081 - й 1082 - к 1083 - л 1084 - м 1085 - н 1086 - о 1087 - п 1088 - р 1089 - с
1090 - т 1091 - у 1092 - ф 1093 - х 1094 - ц 1095 - ч 1096 - ш 1097 - щ 1098 - ъ 1099 - ы
1100 - ь 1101 - э 1102 - ю 1103 - я
wofs писал(а): W:=WChar(n);
wofs писал(а):else
i:=i+code-1;
Val(Copy(S,i,4),n,code);
if code=0 then
i:=i+4
else
i:=i+code-1;
if S[i]=';' then Inc(i);
W:=WChar(n);
vitaly_l писал(а):if S[i]=';' then Inc(i);
if S[i]=';'
then Inc(i)
else showMessage('oh! so sorry - код облажался ;) ');
vitaly_l писал(а):Иначе вот этот символ & или вот этот © <== вызовут явный сбой в функции взятой Вами,
function HTMLEntrToUTF8 (const S: WideString): WideString;
var W: WChar;
i,j,n,code: Integer;
_PosSemicolon,_CodeLength:integer;
begin
SetLength(result,length(S));
i:=1; j:=1;
while i<=length(S) do
begin
W:=WChar(S[i]);
if (Copy(S,i,2)='&#') then
begin
i:=i+2;
//detect code Length
_PosSemicolon:=UTF8Pos(';',S,i);
_CodeLength:= _PosSemicolon-i;
if (_CodeLength >=2) and (_CodeLength<=4) then
begin
Val(Copy(S,i,_CodeLength),n,code);
if code=0 then
i:=i+_CodeLength
else
i:=i+code-1;
if S[i]=';' then Inc(i);
W:=WChar(n);
end;
end
else
Inc(i);
result[j]:=W;
Inc(j);
end;
SetLength(result,j-1);
end;
wofs писал(а):if (_CodeLength >=2)
if S[i]=';'
then Inc(i)
else showMessage('oh! so sorry - код облажался ;) ');
else
i:=i+code-1;
vitaly_l писал(а): и сократить код на несколько строк.
function HTMLEntrToUTF8 (const S: WideString): WideString;
var W: WChar;
i,j,n: Integer;
_PosSemicolon,_CodeLength:integer;
begin
SetLength(result,length(S));
i:=1; j:=1;
while i<=length(S) do
begin
W:=WChar(S[i]);
if (Copy(S,i,2)='&#') then
begin
i:=i+2;
//detect code Length
_PosSemicolon:=UTF8Pos(';',S,i);
_CodeLength:= _PosSemicolon-i;
if (_CodeLength >=1) and (_CodeLength<=4) then
begin
TryStrToInt( Copy(S,i,_CodeLength),n); // can be mixed text
i:=i+_CodeLength+1;
W:=WChar(n);
end;
end
else
Inc(i);
result[j]:=W;
Inc(j);
end;
SetLength(result,j-1);
end;
vitaly_l писал(а):что мнемоники совпадают с UTF-8 - в символах, т.к. для символов свои ISO (я давал выше ссылку).
wofs писал(а):Так лучше?
if (_CodeLength >=1) and (_CodeLength<=4) then begin
if TryStrToInt( Copy(S,i,_CodeLength),n)
then W:=WChar(n)
else W := '?' ; // тут нужно что-то на случай, если не...
end else W := '?' ; // тут тоже нужно что-то на случай, если не...
i:=i+_CodeLength+1;
vitaly_l писал(а):да, но более правильно сделать вот так:
function HTMLEntrToUTF8 (const S: WideString): WideString;
var W: WChar;
i,j,n: Integer;
_PosSemicolon,_CodeLength:integer;
begin
SetLength(result,length(S));
i:=1; j:=1;
while i<=length(S) do
begin
W:=WChar(S[i]);
if (Copy(S,i,2)='&#') then
begin
i:=i+2;
//detect code Length
_PosSemicolon:=UTF8Pos(';',S,i);
_CodeLength:= _PosSemicolon-i;
if (_CodeLength >=1) and (_CodeLength<=4) then
begin
if
TryStrToInt( Copy(S,i,_CodeLength),n) // can be mixed text
then
W:=WChar(n)
else
W:='?'; // if no...
i:=i+_CodeLength+1;
end;
end
else
Inc(i);
result[j]:=W;
Inc(j);
end;
SetLength(result,j-1);
end;
wofs писал(а):результат
if (_CodeLength >=1) and (_CodeLength<=4) then begin
if TryStrToInt( Copy(S,i,_CodeLength),n)
then W:=WChar(n)
else W := '?' ; // тут нужно что-то на случай, если не...
end else W := '?' ; // тут тоже нужно что-то на случай, если не...
i:=i+_CodeLength+1;
vitaly_l писал(а):если ВДРУГ мнемоника > 4-х символов.
if (_CodeLength >=1) and (_CodeLength<=6) then
wofs писал(а):Тогда уж лучше ... судя по
function HTMLEntrToUTF8 (const S: WideString): WideString;
var W: WChar;
i,j,n: Integer;
_PosSemicolon,_CodeLength:integer;
begin
SetLength(result,length(S));
i:=1; j:=1;
while i<=length(S) do
begin
W:=WChar(S[i]);
if (Copy(S,i,2)='&#') then
begin
i:=i+2;
//detect code Length
_PosSemicolon:=UTF8Pos(';',S,i);
_CodeLength:= _PosSemicolon-i;
if (_CodeLength >=1) and (_CodeLength<=6) then
begin
if
TryStrToInt( Copy(S,i,_CodeLength),n) // can be mixed text
then
W:=WChar(n)
else
W:='?'; // if no...
// i:=i+_CodeLength+1;
end else
W:='?'; // if no...
i:=i+_CodeLength+1;
end
else
Inc(i);
result[j]:=W;
Inc(j);
end;
SetLength(result,j-1);
end;
&#test text;
wofs писал(а):вот так
wofs писал(а):test text
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7