每次将余数传递给ReadString时,我是否必须使用 L ?
s = MyIni->ReadString (L"ü", L"SomeEntry", "");
Embarcadero示例没有这么说,但是他们在示例中也没有使用非ASCII字符。
答案 0 :(得分:3)
在C ++ Builder 2009和更高版本中,整个RTL基于System::UnicodeString
而不是System::AnsiString
。使用L
前缀告诉编译器创建一个 wide 字符串文字(基于wchar_t
),而不是一个 narrow 字符串文字(基于{ {1}}。
虽然您不必使用前缀char
,但应该使用它,因为它在运行时调用的开销较小。在Windows上,从L
字符串构造UnicodeString
只是一个简单的内存副本,而从wchar_t
字符串构造它则执行数据转换(使用char
变量用于转换的代码页)。转换 MAY 对于非ASCII字符而言是有损的,具体取决于 narrow 字符串的编码,字符串的编码也取决于保存源文件的字符集作为编译器解析源文件时使用的字符集。因此,不能保证您用 narrow 字符串文字编写的代码就是在运行时实际获得的内容。使用 wide 字符串文字可避免这种歧义。
请注意,System::DefaultSystemCodePage
在所有平台上都是UTF-16编码的,但是UnicodeString
仅在Windows上用于UTF-16,其中wchar_t
是16位数据类型。在其他平台上,wchar_t
通常是用于UTF-32的32位数据类型,而使用wchar_t
代替。因此,如果您需要编写可移植的代码,请使用RTL的char16_t
宏,而不要直接使用_D()
前缀,例如:
L
s = MyIni->ReadString(_D("ü"), _D("SomeEntry"), _D(""));
会将字符串/字符文字映射到正确的数据类型(_D()
或wchar_t
,具体取决于要编译的平台)。因此,当在RTL,VCL和FMX库中使用字符串/字符文字时,应该养成始终使用char16_t
的习惯。