【发布时间】:2018-08-06 16:25:12
【问题描述】:
每次将余弦传递给 ReadString 时是否必须使用 L?
s = MyIni->ReadString (L"ü", L"SomeEntry", "");
Embarcadero 示例没有这样说,但他们也没有在示例中使用非 ASCII 字符。
【问题讨论】:
标签: c++builder c++builder-xe5 c++builder-tokyo
每次将余弦传递给 ReadString 时是否必须使用 L?
s = MyIni->ReadString (L"ü", L"SomeEntry", "");
Embarcadero 示例没有这样说,但他们也没有在示例中使用非 ASCII 字符。
【问题讨论】:
标签: c++builder c++builder-xe5 c++builder-tokyo
在 C++Builder 2009 及更高版本中,整个 RTL 基于 System::UnicodeString 而不是 System::AnsiString。使用L 前缀告诉编译器创建一个宽 字符串文字(基于wchar_t)而不是一个窄 字符串文字(基于char)。
虽然您不必使用前缀L,但您应该使用它,因为它在运行时调用的开销更少。在 Windows 上,从 wchar_t 字符串构造 UnicodeString 只是一个简单的内存副本,而从 char 字符串构造它会执行数据转换(使用 System::DefaultSystemCodePage 变量作为用于转换的代码页) .对于非 ASCII 字符,这种转换可能 是有损的,具体取决于 narrow 字符串的编码,这也取决于您保存源文件的字符集作为编译器在解析源文件时使用的字符集。因此,不能保证您在 narrow 字符串文字中编写的代码就是您在运行时实际得到的内容。使用 wide 字符串文字可以避免这种歧义。
请注意,UnicodeString 在所有平台上都是 UTF-16 编码的,但 wchar_t 仅在 Windows 上用于 UTF-16,其中wchar_t 是 16 位数据类型。在其他平台上,wchar_t 通常是用于 UTF-32 的 32 位数据类型,而是使用char16_t。因此,如果您需要编写可移植代码,请使用 RTL 的 _D() 宏而不是直接使用 L 前缀,例如:
s = MyIni->ReadString(_D("ü"), _D("SomeEntry"), _D(""));
_D() 会将字符串/字符文字映射到正确的数据类型(wchar_t 或 char16_t,具体取决于您正在编译的平台)。因此,在 RTL、VCL 和 FMX 库中使用字符串/字符文字时,您应该养成始终使用 _D() 的习惯。
【讨论】:
UnicodeString 喜欢的相同数据类型,即使对于空字符串也是如此。它避免了在运行时调用数据转换例程