System.Character.TCharHelper.IsWhiteSpace
(UTF8)的IsLetter
/ IsNumber
/ AnsiChar
相当于什么?
答案 0 :(得分:2)
通常,询问单个UTF-8元素(单字节)是否表示空格是没有意义的。那是因为UTF-8是一个可变长度编码,代码点可能需要多个单个字节来定义它。
所以你不能问一个字节是否是一个空格,除非它编码一个ASCII字符,即< 128。
您需要做的是获取编码感兴趣的代码点的字节序列,并将它们转换为UCS4Char
变量中的UTF-32值。然后将其传递给UCS4Char
的{{1}}重载。
然而,Delphi库并没有很好地支持这种方法。在Delphi中做你想做的最简单的方法是:
TCharHelper.IsWhiteSpace
。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;