以下是否有任何区别?
auto s1 = L"你好";
auto s2 = u8"你好";
s1
和s2
是否指的是同一类型?
如果不是,有什么区别,哪一个更受欢迎?
答案 0 :(得分:4)
L""
创建一个以null结尾的字符串,类型为const wchar_t[]
。这在C ++ 03中有效。 (注意wchar_t
指的是依赖于实现的“宽字符”类型。
u8""
创建一个以空值终止的UTF-8字符串,类型为const char[]
。这仅在C ++ 11中有效。
您选择哪一个很大程度上取决于您的需求。 L""
适用于C ++ 03,因此如果您需要使用旧代码(可能需要使用C ++ 03编译器编译),则需要使用它。在许多情况下,u8""
更容易使用,尤其是当相关系统通常需要char *
个字符串时。
答案 1 :(得分:4)
它们的类型不同。
s2
是UTF-8或窄字符串文字。 C++11 draft standard部分2.14.5 字符串文字第7段说:
以
u8
开头的字符串文字,例如u8"asdf"
,是 UTF-8字符串文字,并使用给定的字符串进行初始化以UTF-8编码的字符。
第8段说:
普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型“数组 n
const char
”,其中 n 是字符串的大小,如下所示,并具有静态存储时间(3.7)。
s1
是一个宽字符串文字,可以支持UTF-16和UTF-32。第2.14.5节字符串文字第11段说:
以
L
开头的字符串文字,例如L"asdf"
,是一个宽字符串文字。宽字符串文字的类型“ nconst wchar_t
”的数组,其中 n 是字符串的大小,如下所示;它具有静态存储持续时间,并使用给定的字符进行初始化。
请参阅UTF8, UTF16, and UTF32,了解每个人的差异和优势。
确定类型的快捷方法是使用typeid
:
std::cout << typeid(s1).name() << std::endl ;
std::cout << typeid(s2).name() << std::endl ;
在我的系统上,这是输出:
PKw
PKc
使用c++filt -t
检查其中每一项都会给我:
wchar_t const*
char const*
答案 2 :(得分:3)
第一个是宽字符串,可能被编码为UTF-16或UTF-32,或者完全不同的东西(尽管Unicode现在非常普遍,完全不同的编码是不太可能的)。
第二个是使用UTF-8编码的一串窄字符。
至于哪个首选:它取决于你正在做什么,你正在编写什么平台等等。如果你主要处理类似网页/ URL的东西已经被编码为UTF- 8,你可能只是阅读它,可能验证它的内容,然后回复它,将它存储为UTF-8也很有意义。
宽字符串因平台而异。例如,如果您正在为Windows编码,并且许多代码直接与操作系统(使用UTF-16)进行交互,那么将您的字符串存储为UTF-16可以产生很大的意义(这就是Microsoft的编译器用于宽字符串。)