Delphi 判断AnsiStr是否是UTF编码格式 IsUtf8Format

Delphi 判断AnsiStr是否是UTF编码格式 IsUtf8Format

//判断是否是UTF编码格式
function IsUtf8Format(AnsiStr: AnsiString): Boolean;
var
  I, iCount, chr: Integer;
  c: AnsiChar;
  nBytes: Integer; // UFT-8可用1-6个字节编码,ASCII用一个字节
  bAllAscii: Boolean; // 如果全部都是ASCII, 说明不是UTF-8
begin
  Result := False;
  nBytes := 0;
  bAllAscii := True;
  iCount := Length(AnsiStr);
  for I := 1 to iCount do
  begin
    c := AnsiStr[I];
    chr := Ord(c);
    // 判断是否ASCII编码,如果不是,说明有可能是UTF-8,ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx;中文ASCII编码可能最高位为1
    if (chr and $80) <> 0 then
      bAllAscii := False;
    // 如果不是ASCII码,应该是多字节符,计算字节数
    if nBytes = 0 then
    begin
      if chr > $80 then
      begin
        if (chr>=$fc) and (chr<=$fd) then // 1111 1100 and 1111 1101
          nBytes := 6
        else if chr>=$f8 then // 1111 1000
          nBytes := 5
        else if chr>=$f0 then // 1111 0000
          nBytes := 4
        else if chr>=$e0 then // 1110 0000
          nBytes := 3
        else if chr>=$c0 then // 1100 0000
          nBytes := 2
        else Exit;
        Dec(nBytes);
      end;
    end
    else // 多字节符的非首字节,应为 10xxxxxx
    begin
      if (chr and $c0) <> $80 then Exit;
      Dec(nBytes);
    end;
  end;
  // 违返规则
  if nBytes > 0 then
    Exit;
  // 如果全部都是ASCII, 说明不是 UTF-8
  if bAllAscii then
    Exit;

  Result := True;
end;

  

C++

/*
*    判断字符串内指定字符数是否为utf8
*    输入
*        const char *str: 要检查的字符串
*        long length: 要检查的字符串的长度
*        int nWords: 要检查的最大字符数
*/
BOOL CUtility::IsWordsUTF8(const char *str, long length, int nWords)
{
    int i;
    int nBytes=0;//UFT8可用1-6个字节编码,ASCII用一个字节
    unsigned char chr;
    BOOL bAllAscii=TRUE; //如果全部都是ASCII, 说明不是UTF-8
     
    if ( -1 == nWords)
    {
        nWords = (int)length;
    }
 
    for(i=0;i<length;i++)
    {
        if (0 >= nWords)
        {
            return !bAllAscii;
        }       
 
        chr= *(str+i);
        if( (chr&0x80) == 0 ) // 判断是否ASCII编码,如果不是,说明有可能是UTF-8,ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx;中文ASCII编码可能最高位为1
            nWords--;
        else
            bAllAscii= FALSE;
 
        if(nBytes==0) //如果不是ASCII码,应该是多字节符,计算字节数
        {
            if(chr>=0x80)
            {
                nWords--;
                 
                if(chr>=0xFC&&chr<=0xFD)//1111 1100        1111 1101
                    nBytes=6;
                else if(chr>=0xF8)//1111 1000
                    nBytes=5;
                else if(chr>=0xF0)//1111 0000
                    nBytes=4;
                else if(chr>=0xE0)//1110 0000
                    nBytes=3;
                else if(chr>=0xC0)//1100 0000
                    nBytes=2;
                else
                {
                    return FALSE;
                }
 
                nBytes--;
            }
        }
        else //多字节符的非首字节,应为 10xxxxxx
        {
            if( (chr&0xC0) != 0x80 )
            {
                return FALSE;
            }
 
            nBytes--;
        }
    }
 
    if( nBytes > 0 ) //违返规则
    {
        return FALSE;
    }
 
    if( bAllAscii ) //如果全部都是ASCII, 说明不是UTF-8
    {
        return FALSE;
    }
 
    return TRUE;
}

  

 

 

创建时间:2021.04.09  更新时间:

 

posted on 2021-04-09 16:23  滔Roy  阅读(926)  评论(0编辑  收藏  举报

导航