See zpaq source for handling international characters in file names.
Code:
#define UNICODE
#include <windows.h>
makes all Windows command take std::wstring, L"filename", array of wchar_t, etc. In zpaq, I convert UTF-16 to UTF-8 to store in the archive and convert back for I/O. Linux uses UTF-8 natively. Look at class File, function printUTF8(), wtou(), utow() (my UTF 8/16 conversion functions), main() (for command line args). In general look at all "#ifdef unix - #else - #endif" to see how I make zpaq portable between Linux and Windows.