所以如果字符串
•只有字符字符的代码,介于 32 和 127 之间,我可以接受它作为 AnsiString。这很容易实现
是的。但是,128 到 255 之间的字符值(也称为 ANSI/MBCS 字符)也可以存储在 an 中AnsiString
并以可视方式显示,但您必须知道这些值所属的原始字符集。对于 D2009+,您可以将值存储到 a 中RawByteString
并使用该SetCodePage()
函数将适当的代码页与字符串相关联。这样,当您在代码周围传递字符串时,字符会被正确解释。如果您不关心 Unicode 格式之外的非 ASCII 字符,那么您可以忽略这一点。
• 如果不是,我会尝试将其转换为 Utf8String,因为我知道 Utf8String 具有格式,所以我可以决定它是否是有效的 utf8 字符串。所以我需要某种可以告诉我是的函数,它可以是 utf8string。
要检查数据是否为有效的 UTF-8 字符串,您可以使用 Win32 APIWindows.MultiByteToWideChar()
函数或 Embarcadero 的System.LocaleCharsToUnicode()
函数(仅限 XE 及更高版本)。指定CP_UTF8
(65001) 代码页、MB_ERR_INVALID_CHARS
标志和nil
输出缓冲区。如果数据是有效的 UTF-8 字符串,则函数将返回数据在实际解码时可以产生的 UTF-16 字符数。否则,该函数将失败并显示ERROR_NO_UNICODE_TRANSLATION
错误代码。
另一种选择(仅限 D2009 及更高版本)是使用类的GetCharCount()
方法SysUtils.TEncoding.UTF8
来计算相同数量的 UTF-16 字符。
•如果仍然不是这样,我想将其解释为宽字符串,这是最难的部分,因为据我所知它没有任何格式
是的,当然可以 - UTF-16,它与 UTF-8 一样是一种已定义的格式(事实上,UTF-16 有两种风格,小端和大端)。
要检查数据是否为有效的 UTF-16(仅限小端)字符串,您可以使用 Win32 APIWindows.WideCharToMultiByte()
函数或 Embarcadero 的System.UnicodeToLocaleChars()
函数(仅限 XE 及更高版本)。指定CP_UTF8
(65001) 代码页、WC_ERR_INVALID_CHARS
标志和nil
输出缓冲区。如果数据是有效的 UTF-16LE 字符串,则函数将返回数据在实际编码时可以产生的 UTF-8 字节数。否则,该函数将失败并显示ERROR_NO_UNICODE_TRANSLATION
错误代码。
另一种选择(仅限 D2009 及更高版本)是使用(little endian) 或类的GetByteCount()
方法来计算相同数量的 UTF-8 字节。SysUtils.TEncoding.Unicode
SysUtils.TEncoding.BigEndianUnicode
所以我需要在这里猜测很多
不,你没有。对于 UTF-8 和 UTF-16,不涉及猜测。它们是定义明确的标准化格式,它们旨在相互转换而不会丢失任何数据。