-1

每次将余弦传递给 ReadString 时都必须使用L吗?

s = MyIni->ReadString (L"ü", L"SomeEntry", "");

Embarcadero 示例没有这样说,但他们也没有在示例中使用非 ASCII 字符。

4

1 回答 1

3

在 C++Builder 2009 及更高版本中,整个 RTL 基于System::UnicodeString而不是System::AnsiString. 使用L前缀告诉编译器创建一个字符串文字(基于wchar_t)而不是字符串文字(基于char)。

虽然您不必使用前缀L,但您应该使用它,因为它在运行时调用的开销更少。在 Windows 上,UnicodeStringwchar_t字符串构造 a 只是一个简单的内存副本,而从char字符串构造它会执行数据转换(使用System::DefaultSystemCodePage变量作为用于转换的代码页)。对于非 ASCII 字符,这种转换可能是有损的,具体取决于字符串的编码,这取决于您保存源文件的字符集,以及编译器在解析源文件时使用的字符集。因此,不能保证您在代码中以字符串文字编写的内容就是您在运行时实际得到的内容。用一个字符串文字避免了这种歧义。

请注意,UnicodeString它在所有平台上都是 UTF-16 编码的,但wchar_t仅在 Windows 上用于 UTF-16,其中wchar_t16 位数据类型。在其他平台上,wchar_t通常使用 UTF-32 的 32 位数据类型来char16_t代替。因此,如果您需要编写可移植代码,请使用 RTL 的_D()宏而不是L直接使用前缀,例如:

s = MyIni->ReadString(_D("ü"), _D("SomeEntry"), _D(""));

_D()将字符串/字符文字映射到正确的数据类型(wchar_tchar16_t,取决于您正在编译的平台)。因此,在 RTL、VCL 和 FMX 库中使用字符串/字符文字时,您应该养成始终使用_D().

于 2018-08-07T21:11:05.390 回答