определение кодировки UTF-8

 Вчера вечером занялся найденным в интернетах примером:


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)

Может, пригодится?

Комментарии