如何以字节为单位获取 UTF-16LE 字符串的大小?

How to get the size of a UTF-16LE string in bytes?

假设我有以下内容:

wchar_t *str = L"Hello World!";

我想获取 L"Hello World!" 的大小(以字节为单位)(而不是它包含多少个字符)。

我看过wcslen()每2个字节算1个字符,所以如果一个字符是4个字节,它会把它当作2个字符!

这对我来说很棒,因为现在我可以做到:

int size_of_str_in_bytes = wcslen(str) * 2;

但是可以保证 wcslen() 会一直这样吗?

嗯,wcslen 总是给你 wchar_t 的数量。它类似于 strlen

(请注意,与 strlen 一样,终止符 "null" 不包含!)

这与 "counting every 2 bytes as 1 character" 不太一样,但对于 wchar_t 为 2 字节宽的系统,效果是相同的。

不过,我会使用 sizeof(wchar_t) 而不是 2。你知道,为了便携性和所有这些。

比如Coliru的平台有sizeof(wchar_t) == 4:

#include <cwchar>
#include <cassert>

int main()
{
    const wchar_t* wstr = L"Hello world";
    const size_t size_of_wide_cstr_in_bytes = wcslen(wstr) * sizeof(wchar_t);

    assert(sizeof(wchar_t) == 4);             // on this particular system
    assert(size_of_wide_cstr_in_bytes == 44); // on this particular system
}

(live demo)