From 48bd013c63249557ce32305136fc24a1edb6d90e Mon Sep 17 00:00:00 2001 From: Brian Matherly Date: Sat, 19 Oct 2024 10:29:43 -0500 Subject: [PATCH] Fix reading and writing srt files with unicode in the path. --- src/modules/plus/subtitles/subtitles.cpp | 29 ++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/modules/plus/subtitles/subtitles.cpp b/src/modules/plus/subtitles/subtitles.cpp index 9738675b4..fb0a6775a 100644 --- a/src/modules/plus/subtitles/subtitles.cpp +++ b/src/modules/plus/subtitles/subtitles.cpp @@ -23,6 +23,23 @@ #include #include +#ifdef _WIN32 +#include + +static wchar_t *utf8ToWide(const char *strUtf8) +{ + wchar_t *strWide = nullptr; + int n = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, strUtf8, -1, NULL, 0); + if (n > 0) { + strWide = (wchar_t *) calloc(n, sizeof(wchar_t)); + if (strWide) { + MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, strWide, n); + } + } + return strWide; +} +#endif /* ifdef _WIN32 */ + static Subtitles::SubtitleVector readFromSrtStream(std::istream &stream) { enum { @@ -128,13 +145,25 @@ static bool writeToSrtStream(std::ostream &stream, const Subtitles::SubtitleVect Subtitles::SubtitleVector Subtitles::readFromSrtFile(const std::string &path) { +#ifdef _WIN32 + wchar_t *wpath = utf8ToWide(path.c_str()); + std::ifstream fileStream(wpath); + free(wpath); +#else std::ifstream fileStream(path); +#endif return readFromSrtStream(fileStream); } bool Subtitles::writeToSrtFile(const std::string &path, const SubtitleVector &items) { +#ifdef _WIN32 + wchar_t *wpath = utf8ToWide(path.c_str()); + std::ofstream fileStream(wpath, std::ios::out | std::ios::trunc); + free(wpath); +#else std::ofstream fileStream(path.c_str(), std::ios::out | std::ios::trunc); +#endif if (!fileStream.is_open()) { return false; }