If you are able to open the file that has a unicode filename using normal C++, you can open the music file from memory.
Here's a quick, simple example of loading a file into memory and then opening it for music:
std::unique_ptr<char[]> musicMemory;
sf::Music music;
std::ifstream musicFile(filename, std::ios::binary | std::ios::ate); // open at end of file to get size
if (!musicFile.is_open())
std::cerr << "Unable to open file." << std::endl;
else
{
auto filesize = musicFile.tellg(); // store file size
musicMemory.reset(new char[filesize]); // create memory block with the same size as the file
musicFile.seekg(0, std::ios::beg); // go back to the beginning of the file
musicFile.read(musicMemory.get(), filesize); // read entire file into memory block
musicFile.close();
music.openFromMemory(musicMemory.get(), filesize); // open sf::Music from that memory block instead of a file
}
This code is C++11. If you use C++14 (or later), you'd probably use make::unique instead of new. If you use pre-C++11, you'll need to use a raw pointer instead of the unique_ptr.
I wrote this here so it's untested but it should work.
Note that this is just an example of opening from memory; if you are able to use unicode files with C++, you'll have to adapt it to your way.
Note also that both the musicMemory object also needs to stay alive as the music is streamed from that memory instead of from a file.