使用十六进制值初始化UTF-8字符串的长度错误

时间:2017-02-23 15:51:37

标签: c++ c++11 visual-studio-2015 utf-8 string-literals

我正在尝试使用C ++ 11 u8uU文字对此表情符号进行编码:
http://www.fileformat.info/info/unicode/char/1f601/index.htm

现在,我正在使用每个编码的十六进制值来保存它:

const char* utf8string = u8"\xF0\x9F\x98\x81";
const char16_t* utf16string = u"\xD83D\xDE01";
const char32_t* utf32string = U"\x0001F601";

这在GCC 6.2和Clang 3.8中工作正常,每个字符串的长度分别为4,2和1。但在Visual Studio 2015编译器中,它的长度分别为8,2和1。

我正在使用此代码来获取每个字符串的长度:

#include <iostream>
#include <cwchar>

int main() {
    const char* smiley8 = u8"\xF0\x9F\x98\x81";
    const char16_t* smiley16 = u"\xD83D\xDE01";
    const char32_t* smiley32 = U"\x0001F601";

    auto smiley8_it = smiley8;
    while ((*++smiley8_it) != 0);

    auto smiley16_it = smiley16;
    while ((*++smiley16_it) != 0);

    auto smiley32_it = smiley32;
    while ((*++smiley32_it) != 0);

    size_t smiley8_size = smiley8_it - smiley8;
    size_t smiley16_size = smiley16_it - smiley16;
    size_t smiley32_size = smiley32_it - smiley32;

    std::cout << smiley8_size << std::endl;
    std::cout << smiley16_size << std::endl;
    std::cout << smiley32_size << std::endl;
}

我还使用std::strlen测试UTF-8字符串。

为什么会发生这种情况的任何线索?

0 个答案:

没有答案