AnsiChar的System.Character.TCharHelper.IsWhiteSpace / IsLetter / IsNumber的等价物

时间:2018-06-13 11:53:09

标签: delphi

System.Character.TCharHelper.IsWhiteSpace(UTF8)的IsLetter / IsNumber / AnsiChar相当于什么?

3 个答案:

答案 0 :(得分:2)

通常,询问单个UTF-8元素(单字节)是否表示空格是没有意义的。那是因为UTF-8是一个可变长度编码,代码点可能需要多个单个字节来定义它。

所以你不能问一个字节是否是一个空格,除非它编码一个ASCII字符,即< 128。

您需要做的是获取编码感兴趣的代码点的字节序列,并将它们转换为UCS4Char变量中的UTF-32值。然后将其传递给UCS4Char的{​​{1}}重载。

然而,Delphi库并没有很好地支持这种方法。在Delphi中做你想做的最简单的方法是:

  1. 将您的UTF-8字符串转换为原生UTF-16 Delphi TCharHelper.IsWhiteSpace
  2. 使用string查询位置TCharHelper.IsWhiteSpace(str, index)的代码点。

答案 1 :(得分:0)

如果您的问题是如何检查UTF8字符串变量是否全是空格,您可以使用以下RECORD HELPER:

TYPE
  U8StringHelper  = RECORD HELPER FOR UTF8String
                      FUNCTION IsAllWhiteSpaces : BOOLEAN;
                    END;

FUNCTION U8StringHelper.IsAllWhiteSpaces : BOOLEAN;
  VAR
    C : CHAR;
    S : UnicodeString;

  BEGIN
    S:=Self;
    FOR C IN S DO IF NOT C.IsWhiteSpace THEN EXIT(FALSE);
    Result:=TRUE
  END;

然后你可以像以下一样使用它:

VAR
  U8 : UTF8String;

BEGIN
  U8:='  '#13#10;
  IF U8.IsAllWhiteSpaces THEN WRITELN('Yes') ELSE WRITELN('No');
  U8:='  X'#13#10;
  IF U8.IsAllWhiteSpaces THEN WRITELN('Yes') ELSE WRITELN('No');
END.

这将写出"是"其次是" No"。

但请注意,通过为UTF8String类型定义自己的帮助程序,您将无法访问系统可能已定义的任何内容。如果这是一个问题,你必须改为制作标准功能:

FUNCTION IsAllWhiteSpaces(CONST U8 : UTF8String) : BOOLEAN;
  VAR
    C : CHAR;
    S : UnicodeString;

  BEGIN
    S:=U8;
    FOR C IN S DO IF NOT C.IsWhiteSpace THEN EXIT(FALSE);
    Result:=TRUE
  END;

并按如下方式使用:

VAR
  U8 : UTF8String;

BEGIN
  U8:='  '#13#10;
  IF IsAllWhiteSpaces(U8) THEN WRITELN('Yes') ELSE WRITELN('No');
  U8:='  X'#13#10;
  IF IsAllWhiteSpaces(U8) THEN WRITELN('Yes') ELSE WRITELN('No');
END.

我将把其他IsXXX功能的制作留给读者...

答案 2 :(得分:0)

好的 - 在我们最终确定了正确的问题之后,最简单的方法是简单地将AnsiChar变量转换为适当的UNICODE字符然后再做你的事情。

VAR
  A : AnsiChar;

BEGIN
  IF CHAR(A).IsLetter THEN ...
END.

HOWEVER :不建议使用UTF-8字符串中的单个字符,因为许多字符(根据UTF-8的本质)由 TWO 字符组成。因此,您无法确定UTF-8字符串中的单个AnsiChar是否为任何内容,因为它只能是“前缀”/“转义”字符,而实际字符是字符串中的以下字符。

因此,最好的方法是使用UTF8-String并将其分配给UNICODE字符串变量,然后使用正确的CHAR类型迭代它。

如果您的问题是如何将以UTF-8编码的AnsiString“转换”为UNICODE字符串,您可以使用以下例程:

FUNCTION AnsiUTF8toUNICODE(CONST S : AnsiString) : STRING;
  BEGIN
    Result:=UTF8ToUnicodeString(RawString(S))
  END;