Я использую wcslen
для определения длины широкой строки с завершающим нулем (wchar_t*
), но у меня есть некоторые проблемы с этой функцией в компиляторе MSCV.
Пример кода:
#include <iostream>
#include <cstring>
#include <cwchar>
int main()
{
auto sc = "The good and bad";
auto wsc = L"Уставший лесник";
auto ws = std::wstring(wsc);
std::cout << "sc len:" << std::strlen(sc) << std::endl;
std::cout << "wsc len:" << std::wcslen(wsc) << std::endl;
std::cout << "ws len:" << ws.length() << std::endl;
}
Выход MSVC (amd64 16.8.2 x64):
sc len:16
wsc len:29
ws len:29
Выход Clang (10.0.0 (GNU CLI) для MSVC 16.8.30717.126):
sc len:16
wsc len:15
ws len:15
Это проблема компилятора MSCV, какое-то неопределенное поведение или нюансы реализации MSCV?
Вам нужно сохранить файл как UTF-16 или UTF-8 с BOM. MSVC, похоже, не может обрабатывать файл UTF-8 без спецификации (что понятно, поскольку кодировка символов такого файла является вопросом интерпретации).
Некоторые редакторы (я использую Notepad2) называют это «UTF-8 с подписью».
Поскольку UTF-16 является форматом переменной длины (2 или 4 байта), из документации MS мне неясно, возвращает ли
std::wcslen
количество символов Unicode или только количествоwchar_t
в буфере.