--- /dev/null
+ .gitignore | 6 ++
+ cli/utils.c | 21 +++--
+ cli/win32_unicode_support.c | 197 ++++++++++++++++++++++++++++++++++++++++++++
+ cli/win32_unicode_support.h | 49 +++++++++++
+ cli/wvunpack.c | 71 +++++++++++++---
+ src/open_utils.c | 5 +-
+ 6 files changed, 331 insertions(+), 18 deletions(-)
+
+diff --git a/.gitignore b/.gitignore
+index eb3a2f7..b09320e 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -1 +1,7 @@
+ /_old_
++/src/Release
++/Backup1
++/Release
++/*.sdf
++/wavpackexe/Release
++/wvunpackexe/Release
+diff --git a/cli/utils.c b/cli/utils.c
+index 8ead3df..9925a8c 100644
+--- a/cli/utils.c
++++ b/cli/utils.c
+@@ -30,6 +30,7 @@
+
+ #include "wavpack.h"
+ #include "utils.h"
++#include "win32_unicode_support.h"
+
+ #ifdef WIN32
+ #define fileno _fileno
+@@ -81,7 +82,7 @@ int copy_timestamp(const char *src_filename, const char *dst_filename)
+ if (strcmp(src_filename, "-") == 0 || strcmp(dst_filename, "-") == 0)
+ return TRUE;
+
+- if (stat(src_filename, &fileinfo))
++ if (stat_utf8(src_filename, &fileinfo))
+ return FALSE; /* stat failed */
+
+ times[0].tv_sec = fileinfo.st_atime;
+@@ -186,7 +187,7 @@ char *filespec_path (char *filespec)
+ globs.gl_pathc > 0)
+ {
+ /* test if the file is a directory */
+- if (stat(globs.gl_pathv[0], &fstats) == 0 && (fstats.st_mode & S_IFDIR)) {
++ if (stat_utf8(globs.gl_pathv[0], &fstats) == 0 && (fstats.st_mode & S_IFDIR)) {
+ filespec[0] = '\0';
+ strcat (filespec, globs.gl_pathv[0]);
+ globfree(&globs);
+@@ -368,6 +369,7 @@ char yna (void)
+ fprintf (stderr, "%c", 7);
+ }
+
++ fflush(stderr);
+ waiting_input = 0;
+
+ return choice;
+@@ -446,6 +448,7 @@ void error_line (char *error, ...)
+ vsprintf (error_msg + 1, error, argptr);
+ va_end (argptr);
+ fputs (error_msg, stderr);
++ fflush(stderr);
+ finish_line ();
+
+ if (debug_logging_mode) {
+@@ -454,7 +457,7 @@ void error_line (char *error, ...)
+
+ if (get_app_path (file_path)) {
+ strcat (file_path, "\\WavPack\\wavpack.log");
+- error_log = fopen (file_path, "a+");
++ error_log = fopen_utf8 (file_path, "a+");
+
+ if (!error_log) {
+ get_app_path (file_path);
+@@ -462,13 +465,13 @@ void error_line (char *error, ...)
+
+ if (CreateDirectory (file_path, NULL)) {
+ strcat (file_path, "\\wavpack.log");
+- error_log = fopen (file_path, "a+");
++ error_log = fopen_utf8 (file_path, "a+");
+ }
+ }
+ }
+
+ if (!error_log)
+- error_log = fopen ("c:\\wavpack.log", "a+");
++ error_log = fopen_utf8 ("c:\\wavpack.log", "a+");
+
+ if (error_log) {
+ fputs (error_msg + 1, error_log);
+@@ -490,6 +493,7 @@ void error_line (char *error, ...)
+ vsprintf (error_msg + 1, error, argptr);
+ va_end (argptr);
+ fputs (error_msg, stderr);
++ fflush(stderr);
+ finish_line ();
+ }
+
+@@ -508,10 +512,11 @@ void debug_line (char *error, ...)
+ vsprintf (error_msg + 1, error, argptr);
+ va_end (argptr);
+ fputs (error_msg, stderr);
++ fflush(stderr);
+ finish_line ();
+
+ if (debug_logging_mode) {
+- FILE *error_log = fopen ("c:\\wavpack.log", "a+");
++ FILE *error_log = fopen_utf8 ("c:\\wavpack.log", "a+");
+
+ if (error_log) {
+ fputs (error_msg + 1, error_log);
+@@ -589,6 +594,8 @@ void finish_line (void)
+ }
+ else
+ fputc ('\n', stderr);
++
++ fflush(stderr);
+ }
+ #else
+ //////////////////////////////////////////////////////////////////////////////
+@@ -599,6 +606,7 @@ void finish_line (void)
+ void finish_line (void)
+ {
+ fprintf (stderr, " \n");
++ fflush(stderr);
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+@@ -778,6 +786,7 @@ void DoSetConsoleTitle (char *text)
+ void DoSetConsoleTitle (char *text)
+ {
+ fprintf (stderr, "\033]0;%s\007", text);
++ fflush(stderr);
+ }
+
+ #endif
+diff --git a/cli/win32_unicode_support.c b/cli/win32_unicode_support.c
+new file mode 100644
+index 0000000..513cebc
+--- /dev/null
++++ b/cli/win32_unicode_support.c
+@@ -0,0 +1,197 @@
++/* Copyright (c) 2004-2012 LoRd_MuldeR <mulder2@gmx.de>
++ File: unicode_support.c
++
++ This file was originally part of a patch included with LameXP,
++ released under the same license as the original audio tools.
++
++ Redistribution and use in source and binary forms, with or without
++ modification, are permitted provided that the following conditions
++ are met:
++
++ - Redistributions of source code must retain the above copyright
++ notice, this list of conditions and the following disclaimer.
++
++ - Redistributions in binary form must reproduce the above copyright
++ notice, this list of conditions and the following disclaimer in the
++ documentation and/or other materials provided with the distribution.
++
++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
++ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++*/
++#if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64
++
++#include "win32_unicode_support.h"
++
++#include <windows.h>
++#include <io.h>
++
++static UINT g_old_output_cp = ((UINT)-1);
++
++char *utf16_to_utf8(const wchar_t *input)
++{
++ char *Buffer;
++ int BuffSize = 0, Result = 0;
++
++ BuffSize = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL);
++ Buffer = (char*) malloc(sizeof(char) * BuffSize);
++ if(Buffer)
++ {
++ Result = WideCharToMultiByte(CP_UTF8, 0, input, -1, Buffer, BuffSize, NULL, NULL);
++ }
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++char *utf16_to_ansi(const wchar_t *input)
++{
++ char *Buffer;
++ int BuffSize = 0, Result = 0;
++
++ BuffSize = WideCharToMultiByte(CP_ACP, 0, input, -1, NULL, 0, NULL, NULL);
++ Buffer = (char*) malloc(sizeof(char) * BuffSize);
++ if(Buffer)
++ {
++ Result = WideCharToMultiByte(CP_ACP, 0, input, -1, Buffer, BuffSize, NULL, NULL);
++ }
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++wchar_t *utf8_to_utf16(const char *input)
++{
++ wchar_t *Buffer;
++ int BuffSize = 0, Result = 0;
++
++ BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0);
++ Buffer = (wchar_t*) malloc(sizeof(wchar_t) * BuffSize);
++ if(Buffer)
++ {
++ Result = MultiByteToWideChar(CP_UTF8, 0, input, -1, Buffer, BuffSize);
++ }
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++void init_commandline_arguments_utf8(int *argc, char ***argv)
++{
++ int i, nArgs;
++ LPWSTR *szArglist;
++
++ szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
++
++ if(NULL == szArglist)
++ {
++ fprintf(stderr, "\nFATAL: CommandLineToArgvW failed\n\n");
++ exit(-1);
++ }
++
++ *argv = (char**) malloc(sizeof(char*) * nArgs);
++ *argc = nArgs;
++
++ if(NULL == *argv)
++ {
++ fprintf(stderr, "\nFATAL: Malloc failed\n\n");
++ exit(-1);
++ }
++
++ for(i = 0; i < nArgs; i++)
++ {
++ (*argv)[i] = utf16_to_utf8(szArglist[i]);
++ if(NULL == (*argv)[i])
++ {
++ fprintf(stderr, "\nFATAL: utf16_to_utf8 failed\n\n");
++ exit(-1);
++ }
++ }
++
++ LocalFree(szArglist);
++}
++
++void free_commandline_arguments_utf8(int *argc, char ***argv)
++{
++ int i = 0;
++
++ if(*argv != NULL)
++ {
++ for(i = 0; i < *argc; i++)
++ {
++ if((*argv)[i] != NULL)
++ {
++ free((*argv)[i]);
++ (*argv)[i] = NULL;
++ }
++ }
++ free(*argv);
++ *argv = NULL;
++ }
++}
++
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8)
++{
++ FILE *ret = NULL;
++ wchar_t *filename_utf16 = utf8_to_utf16(filename_utf8);
++ wchar_t *mode_utf16 = utf8_to_utf16(mode_utf8);
++
++ if(filename_utf16 && mode_utf16)
++ {
++ ret = _wfopen(filename_utf16, mode_utf16);
++ }
++
++ if(filename_utf16) free(filename_utf16);
++ if(mode_utf16) free(mode_utf16);
++
++ return ret;
++}
++
++int stat_utf8(const char *path_utf8, struct _stat *buf)
++{
++ int ret = -1;
++
++ wchar_t *path_utf16 = utf8_to_utf16(path_utf8);
++ if(path_utf16)
++ {
++ ret = _wstat(path_utf16, buf);
++ free(path_utf16);
++ }
++
++ return ret;
++}
++
++int unlink_utf8(const char *path_utf8)
++{
++ int ret = -1;
++
++ wchar_t *path_utf16 = utf8_to_utf16(path_utf8);
++ if(path_utf16)
++ {
++ ret = _wunlink(path_utf16);
++ free(path_utf16);
++ }
++
++ return ret;
++}
++
++void init_console_utf8(void)
++{
++ g_old_output_cp = GetConsoleOutputCP();
++ SetConsoleOutputCP(CP_UTF8);
++}
++
++void uninit_console_utf8(void)
++{
++ if(g_old_output_cp != ((UINT)-1))
++ {
++ SetConsoleOutputCP(g_old_output_cp);
++ }
++}
++
++#endif
+diff --git a/cli/win32_unicode_support.h b/cli/win32_unicode_support.h
+new file mode 100644
+index 0000000..40c2e33
+--- /dev/null
++++ b/cli/win32_unicode_support.h
+@@ -0,0 +1,49 @@
++/* Copyright (c) 2004-2012 LoRd_MuldeR <mulder2@gmx.de>
++ File: unicode_support.h
++
++ This file was originally part of a patch included with LameXP,
++ released under the same license as the original audio tools.
++
++ Redistribution and use in source and binary forms, with or without
++ modification, are permitted provided that the following conditions
++ are met:
++
++ - Redistributions of source code must retain the above copyright
++ notice, this list of conditions and the following disclaimer.
++
++ - Redistributions in binary form must reproduce the above copyright
++ notice, this list of conditions and the following disclaimer in the
++ documentation and/or other materials provided with the distribution.
++
++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
++ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++*/
++#ifndef UNICODE_SUPPORT_H_INCLUDED
++#define UNICODE_SUPPORT_H_INCLUDED
++
++#include <stdio.h>
++#include <sys/stat.h>
++
++#define WIN_UNICODE 1
++
++char *utf16_to_utf8(const wchar_t *input);
++char *utf16_to_ansi(const wchar_t *input);
++wchar_t *utf8_to_utf16(const char *input);
++void init_commandline_arguments_utf8(int *argc, char ***argv);
++void free_commandline_arguments_utf8(int *argc, char ***argv);
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8);
++int stat_utf8(const char *path_utf8, struct _stat *buf);
++int unlink_utf8(const char *path_utf8);
++void init_console_utf8(void);
++void uninit_console_utf8(void);
++
++#endif
+diff --git a/cli/wvunpack.c b/cli/wvunpack.c
+index e12b5c3..255a6a5 100644
+--- a/cli/wvunpack.c
++++ b/cli/wvunpack.c
+@@ -46,6 +46,7 @@
+ #include "wavpack.h"
+ #include "utils.h"
+ #include "md5.h"
++#include "win32_unicode_support.h"
+
+ #ifdef WIN32
+ #define strdup(x) _strdup(x)
+@@ -159,7 +160,7 @@ static void display_progress (double file_progress);
+ // The "main" function for the command-line WavPack decompressor. //
+ //////////////////////////////////////////////////////////////////////////////
+
+-int main (argc, argv) int argc; char **argv;
++static int wvunpack_main (argc, argv) int argc; char **argv;
+ {
+ #ifdef __EMX__ /* OS/2 */
+ _wildcard (&argc, &argv);
+@@ -196,7 +197,7 @@ int main (argc, argv) int argc; char **argv;
+ #endif
+
+ #if defined (WIN32)
+- set_console_title = 1; // on Windows, we default to messing with the console title
++ set_console_title = 0; // on Windows, we default to messing with the console title
+ #endif // on Linux, this is considered uncool to do by default
+
+ // loop through command-line arguments
+@@ -450,9 +451,15 @@ int main (argc, argv) int argc; char **argv;
+ }
+
+ if (strcmp (WavpackGetLibraryVersionString (), PACKAGE_VERSION))
++ {
+ fprintf (stderr, version_warning, WavpackGetLibraryVersionString (), PACKAGE_VERSION);
++ fflush(stderr);
++ }
+ else if (!quiet_mode && !error_count)
++ {
+ fprintf (stderr, sign_on, VERSION_OS, WavpackGetLibraryVersionString ());
++ fflush(stderr);
++ }
+
+ if (!num_files) {
+ printf ("%s", usage);
+@@ -473,7 +480,7 @@ int main (argc, argv) int argc; char **argv;
+ // frontends, but could be used for other purposes.
+
+ if (*infilename == '@') {
+- FILE *list = fopen (infilename+1, "rt");
++ FILE *list = fopen_utf8 (infilename+1, "rt");
+ int di, c;
+
+ for (di = file_index; di < num_files - 1; di++)
+@@ -517,7 +524,7 @@ int main (argc, argv) int argc; char **argv;
+ }
+ #if defined (WIN32)
+ else if (filespec_wild (infilename)) {
+- FILE *list = fopen (infilename+1, "rt");
++ FILE *list = fopen_utf8 (infilename+1, "rt");
+ intptr_t file;
+ int di;
+
+@@ -556,7 +563,7 @@ int main (argc, argv) int argc; char **argv;
+ // be passed on the command-line, but could be used for other purposes.
+
+ if (outfilename && outfilename [0] == '@') {
+- FILE *list = fopen (outfilename+1, "rt");
++ FILE *list = fopen_utf8 (outfilename+1, "rt");
+ int c;
+
+ if (list == NULL) {
+@@ -629,7 +636,10 @@ int main (argc, argv) int argc; char **argv;
+ strcat (outfilename, raw_decode ? ".raw" : ".wav");
+
+ if (num_files > 1 && !quiet_mode)
++ {
+ fprintf (stderr, "\n%s:\n", matches [file_index]);
++ fflush(stderr);
++ }
+
+ result = unpack_file (matches [file_index], verify_only ? NULL : outfilename);
+
+@@ -653,9 +663,15 @@ int main (argc, argv) int argc; char **argv;
+
+ if (num_files > 1) {
+ if (error_count)
++ {
+ fprintf (stderr, "\n **** warning: errors occurred in %d of %d files! ****\n", error_count, num_files);
++ fflush(stderr);
++ }
+ else if (!quiet_mode)
++ {
+ fprintf (stderr, "\n **** %d files successfully processed ****\n", num_files);
++ fflush(stderr);
++ }
+ }
+
+ free (matches);
+@@ -742,7 +758,7 @@ static FILE *open_output_file (char *filename, char **tempfilename)
+ return stdout;
+ }
+
+- testfile = fopen (filename, "rb");
++ testfile = fopen_utf8 (filename, "rb");
+
+ if (testfile) {
+ size_t res = fread (&dummy, 1, 1, testfile);
+@@ -754,6 +770,7 @@ static FILE *open_output_file (char *filename, char **tempfilename)
+
+ if (!overwrite_all) {
+ fprintf (stderr, "overwrite %s (yes/no/all)? ", FN_FIT (filename));
++ fflush(stderr);
+
+ if (set_console_title)
+ DoSetConsoleTitle ("overwrite?");
+@@ -787,7 +804,7 @@ static FILE *open_output_file (char *filename, char **tempfilename)
+ strcat (*tempfilename, ".tmp");
+ }
+
+- testfile = fopen (*tempfilename, "rb");
++ testfile = fopen_utf8 (*tempfilename, "rb");
+
+ if (!testfile)
+ break;
+@@ -801,7 +818,7 @@ static FILE *open_output_file (char *filename, char **tempfilename)
+ }
+ }
+
+- retval = fopen (*tempfilename ? *tempfilename : filename, "w+b");
++ retval = fopen_utf8 (*tempfilename ? *tempfilename : filename, "w+b");
+
+ if (retval == NULL)
+ error_line ("can't create file %s!", *tempfilename ? *tempfilename : filename);
+@@ -960,11 +977,17 @@ static int unpack_file (char *infilename, char *outfilename)
+ }
+ else if (*outfilename == '-') {
+ if (!quiet_mode)
++ {
+ fprintf (stderr, "unpacking %s%s to stdout,", *infilename == '-' ?
+ "stdin" : FN_FIT (infilename), wvc_mode ? " (+.wvc)" : "");
++ fflush(stderr);
++ }
+ }
+ else if (!quiet_mode)
++ {
+ fprintf (stderr, "restoring %s,", FN_FIT (outfilename));
++ fflush(stderr);
++ }
+
+ if (outbuf_k)
+ output_buffer_size = outbuf_k * 1024;
+@@ -983,8 +1006,11 @@ static int unpack_file (char *infilename, char *outfilename)
+ outfile = NULL;
+
+ if (!quiet_mode)
++ {
+ fprintf (stderr, "verifying %s%s,", *infilename == '-' ? "stdin" :
+ FN_FIT (infilename), wvc_mode ? " (+.wvc)" : "");
++ fflush(stderr);
++ }
+ }
+
+ #if defined(WIN32)
+@@ -1071,6 +1097,7 @@ static int unpack_file (char *infilename, char *outfilename)
+ #else
+ fprintf (stderr, "\n");
+ #endif
++ fflush(stderr);
+ DoTruncateFile (outfile);
+ result = SOFT_ERROR;
+ break;
+@@ -1085,8 +1112,11 @@ static int unpack_file (char *infilename, char *outfilename)
+ progress = floor (progress * 100.0 + 0.5);
+
+ if (!quiet_mode)
++ {
+ fprintf (stderr, "%s%3d%% done...",
+ nobs ? " " : "\b\b\b\b\b\b\b\b\b\b\b\b", (int) progress);
++ fflush(stderr);
++ }
+ }
+ }
+
+@@ -1364,9 +1394,10 @@ static int do_tag_extractions (WavpackContext *wpc, char *outfilename)
+ else
+ strcpy (filespec_name (full_filename), tag_filename);
+
+- if (!overwrite_all && (outfile = fopen (full_filename, "r")) != NULL) {
++ if (!overwrite_all && (outfile = fopen_utf8 (full_filename, "r")) != NULL) {
+ DoCloseHandle (outfile);
+ fprintf (stderr, "overwrite %s (yes/no/all)? ", FN_FIT (full_filename));
++ fflush(stderr);
+
+ if (set_console_title)
+ DoSetConsoleTitle ("overwrite?");
+@@ -1385,7 +1416,7 @@ static int do_tag_extractions (WavpackContext *wpc, char *outfilename)
+ // open output file for writing
+
+ if (*full_filename) {
+- if ((outfile = fopen (full_filename, "w")) == NULL) {
++ if ((outfile = fopen_utf8 (full_filename, "w")) == NULL) {
+ error_line ("can't create file %s!", FN_FIT (full_filename));
+ result = SOFT_ERROR;
+ }
+@@ -2074,3 +2105,23 @@ void display_progress (double file_progress)
+ DoSetConsoleTitle (title);
+ }
+ }
++
++//////////////////////////////////////////////////////////////////////////////
++// MAIN
++//////////////////////////////////////////////////////////////////////////////
++
++int main(int argc, char **argv)
++{
++ int ret = -1, argc_utf8 = -1;
++ char **argv_utf8 = NULL;
++
++ init_console_utf8();
++ init_commandline_arguments_utf8(&argc_utf8, &argv_utf8);
++
++ ret = wvunpack_main(argc_utf8, argv_utf8);
++
++ free_commandline_arguments_utf8(&argc_utf8, &argv_utf8);
++ uninit_console_utf8();
++
++ return ret;
++}
+diff --git a/src/open_utils.c b/src/open_utils.c
+index a8c7baa..a77f90f 100644
+--- a/src/open_utils.c
++++ b/src/open_utils.c
+@@ -20,6 +20,7 @@
+ #include <string.h>
+
+ #include "wavpack_local.h"
++#include "../cli/win32_unicode_support.h"
+
+ // This code provides an interface between the reader callback mechanism that
+ // WavPack uses internally and the standard fstream C library. This allows an
+@@ -137,7 +138,7 @@ WavpackContext *WavpackOpenFileInput (const char *infilename, char *error, int f
+ setmode (fileno (stdin), O_BINARY);
+ #endif
+ }
+- else if ((wv_id = fopen (infilename, file_mode)) == NULL) {
++ else if ((wv_id = fopen_utf8 (infilename, file_mode)) == NULL) {
+ if (error) strcpy (error, (flags & OPEN_EDIT_TAGS) ? "can't open file for editing" : "can't open file");
+ return NULL;
+ }
+@@ -147,7 +148,7 @@ WavpackContext *WavpackOpenFileInput (const char *infilename, char *error, int f
+
+ strcpy (in2filename, infilename);
+ strcat (in2filename, "c");
+- wvc_id = fopen (in2filename, "rb");
++ wvc_id = fopen_utf8 (in2filename, "rb");
+ free (in2filename);
+ }
+ else