Вчера вечером занялся найденным в интернетах примером:
Global *m
Global fs
;// Зная, что длина кодируется в первом байте так: 0b110xxxxx для 2 байт, 0b1110xxxx для трёх и так далее, в общем число бит равных 1 слева = число байт кодирующих символ, потом бит 0 что бы показать конец этого безобразия
Procedure get_lenCharInUTF8(inputchar.a)
If inputchar & %11000000 = %10000000
ProcedureReturn 1
EndIf
If inputchar & %11100000 = %11000000
ProcedureReturn 2
EndIf
If inputchar & %11110000 = %11100000
ProcedureReturn 3
EndIf
If inputchar & %11111000 = %11110000
ProcedureReturn 4
EndIf
If inputchar & %11111100 = %11111000
ProcedureReturn 5
EndIf
ProcedureReturn 0
EndProcedure
Procedure is_TextUTF8()
loadUTFsymbol=0;
loadNoUTFsymbol=0
;// If (inputtxt[0]==0xef && inputtxt[1]==0xbb && inputtxt[2]==0xbf){Return TRUE;} // это если верите в BOM, то раскомментируйте эту строку, иначе будем всё же анализировать текст
If (PeekA(*m)=$ef) And (PeekA(*m+1)=$bb) And (PeekA(*m+2)=$bf)
ProcedureReturn 1
EndIf
ix=0
While ix<fs-1;For (unsigned int ix=0; ix < inputtxtlen; ix++){
tempsyminfile.a=PeekA(*m+ix);inputtxt[ix];
;If (tempsyminfile >127 && tempsyminfile != 0xfe && tempsyminfile != 0xff){
If (tempsyminfile >127) And (tempsyminfile <> $fe) And (tempsyminfile <> $ff)
tmpsymleninfileutf=get_lenCharInUTF8(tempsyminfile);
;If (tmpsymleninfileutf ==0){
If tmpsymleninfileutf=0
loadNoUTFsymbol+1
Else
If tmpsymleninfileutf >3
loadNoUTFsymbol+1
EndIf
tempsyminfile=PeekA(*m+ix+1);Temp_text_buffer[ix+1];
If (tempsyminfile < $80) Or (tempsyminfile > $BF)
loadNoUTFsymbol+1
Else
tempsyminfile=PeekA(*m+ix+tmpsymleninfileutf);Temp_text_buffer[ix+tmpsymleninfileutf];
If (tempsyminfile >127) And (tempsyminfile <> $fe) And(tempsyminfile <> $ff)
If get_lenCharInUTF8(tempsyminfile) <>0
ix=ix+tmpsymleninfileutf-1
loadUTFsymbol+1
Else
loadNoUTFsymbol+1
EndIf
Else
loadNoUTFsymbol+1
EndIf
EndIf
EndIf
EndIf
ix+1
Wend
If loadUTFsymbol > loadNoUTFsymbol
ProcedureReturn 1;Return TRUE;}
EndIf
ProcedureReturn 0;Return FALSE ;
EndProcedure
f$="2.html"
fs=FileSize(f$)
*m=AllocateMemory(fs)
ReadFile(0,f$)
ReadData(0,*m,fs)
CloseFile(0)
;detect
Debug is_TextUTF8()
FreeMemory(*m)
Может, пригодится?
Комментарии
Отправить комментарий