L“”和u8“之间的差异”

时间:2013-08-20 01:15:29

标签: c++ string c++11 utf-8

以下是否有任何区别?

auto s1 = L"你好";
auto s2 = u8"你好";

s1s2是否指的是同一类型? 如果不是,有什么区别,哪一个更受欢迎?

3 个答案:

答案 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" ,是一个宽字符串文字。宽字符串文字的类型 n const 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的编译器用于宽字符串。)