我正在尝试使用C ++ 11 u8
,u
和U
文字对此表情符号进行编码:
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字符串。
为什么会发生这种情况的任何线索?