Модератор: Модераторы
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) thenwofs писал(а):Тогда уж лучше ... судя по
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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1