Delphi 判断AnsiStr是否是UTF编码格式 IsUtf8Format
Delphi 判断AnsiStr是否是UTF编码格式 IsUtf8Format
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | //判断是否是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++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | /* * 判断字符串内指定字符数是否为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 更新时间:
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
分类:
Delphi 编码/格式
标签:
Delphi
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报