Commit 9703a401 authored by Max Kellermann's avatar Max Kellermann

Playlist{File,Save}: always use UTF-8 in playlists on Windows

Turns out that using CP_ACP is a lousy idea, because only very few Unicode characters can be represented by it. Instead, switch to UTF-8 (which every sane person on other operating system already uses). Closes #102
parent 753a2aa4
...@@ -6,6 +6,7 @@ ver 0.20.11 (not yet released) ...@@ -6,6 +6,7 @@ ver 0.20.11 (not yet released)
- gme: fix track numbering - gme: fix track numbering
* improve random song order when switching songs manually * improve random song order when switching songs manually
* fix case insensitive search without libicu * fix case insensitive search without libicu
* fix Unicode file names in playlists on Windows
* fix endless loop when accessing malformed file names in ZIP files * fix endless loop when accessing malformed file names in ZIP files
ver 0.20.10 (2017/08/24) ver 0.20.10 (2017/08/24)
......
...@@ -207,13 +207,12 @@ try { ...@@ -207,13 +207,12 @@ try {
continue; continue;
#ifdef _UNICODE #ifdef _UNICODE
wchar_t buffer[MAX_PATH]; /* on Windows, playlists always contain UTF-8, because
auto result = MultiByteToWideChar(CP_ACP, 0, s, -1, its "narrow" charset (i.e. CP_ACP) is incapable of
buffer, ARRAY_SIZE(buffer)); storing all Unicode paths */
if (result <= 0) const auto path = AllocatedPath::FromUTF8(s);
if (path.IsNull())
continue; continue;
const Path path = Path::FromFS(buffer);
#else #else
const Path path = Path::FromFS(s); const Path path = Path::FromFS(s);
#endif #endif
......
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
#include "fs/AllocatedPath.hxx" #include "fs/AllocatedPath.hxx"
#include "fs/Traits.hxx" #include "fs/Traits.hxx"
#include "fs/FileSystem.hxx" #include "fs/FileSystem.hxx"
#include "fs/NarrowPath.hxx"
#include "fs/io/FileOutputStream.hxx" #include "fs/io/FileOutputStream.hxx"
#include "fs/io/BufferedOutputStream.hxx" #include "fs/io/BufferedOutputStream.hxx"
#include "util/UriUtil.hxx" #include "util/UriUtil.hxx"
...@@ -38,7 +37,14 @@ ...@@ -38,7 +37,14 @@
static void static void
playlist_print_path(BufferedOutputStream &os, const Path path) playlist_print_path(BufferedOutputStream &os, const Path path)
{ {
os.Format("%s\n", NarrowPath(path).c_str()); #ifdef _UNICODE
/* on Windows, playlists always contain UTF-8, because its
"narrow" charset (i.e. CP_ACP) is incapable of storing all
Unicode paths */
os.Format("%s\n", path.ToUTF8().c_str());
#else
os.Format("%s\n", path.c_str());
#endif
} }
void void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment