Функция '_wfopen_s' не открывает файл

Здравствуйте. Наткнулся на очередную странную штуку.

#include <iostream>

int main()
{
	const wchar_t* fn = L"C:\\code\\0\\\uFE0F\u2620.txt";
	FILE* file;
	errno_t e = _wfopen_s(&file, fn, L"rb");
	return 0;
}

Снимок экрана 2024-05-18 160406
Снимок экрана 2024-05-18 160324
Функция _wfopen_s() не открывает файл, если в пути присутствуют символы юникода (в данном случае это UTF-16 LE, как я понял). Как видно на скриншотах, строка сгенерировалась правильно и файл по указанному пути существует. Однако, выдаётся код ошибки 2.

Здесь сказано, что это значит No such file or directory.

UTF-16 Hex (C Syntax) 0x2620, 0xFE0F

C/C++/Java Src “\u2620”

Оба варианта - не такие, как написано в коде у тебя:

\uFE0F\u2620

Я думаю, что на скриншоте между \\ и черепом-с-костями есть подозрительное “пустое” пространство, которое является на самом деле лишним символом.

«Universal character names are formed by a prefix \U followed by an eight-digit Unicode code point, or by a prefix \u followed by a four-digit Unicode code point.»

В общем, попробуй вот так:

L"C:\\code\\0\\\u2620.txt"

Это потому что я коды смотрел в HEX-редакторе. Там было написано 20 26 0F FE. Проверил - не работает. Я понял, что порядок байт(ов) неправильный. Поменял местами - 0F FE 20 26 - не работает. Поменял вот так FE F0 26 20 - заработало (символ стал виден, но файл не открывается). На этом моменте мозг отказался продолжать работать по причине ошибки segmentation fault.
Почему тогда символ стал виден, если код по факту неправильный? :thinking: Почему такие подставы? Хотя, это наверное какой-нибудь UTF-16 BE и вижуалка его поняла. А у файла имя в UTF-16 LE. Или наоборот. Тогда всё понятно.
Короче, опять протупил как обычно.
И вообще я эту черепушку из виртуальной машины с линуксом скопипастил :man_facepalming: Там UTF-8. Я, почему-то, был уверен, что при вставке винда сама в нужный формат преобразует :clkolunknown: Совсем забыл, что имена файлов тоже могут иметь разную кодировку. Точнее, это первый раз, когда с этим столкнулся.