diff options
author | Andre Heinecke <[email protected]> | 2015-11-30 15:09:40 +0000 |
---|---|---|
committer | Andre Heinecke <[email protected]> | 2015-12-07 13:30:09 +0000 |
commit | 823e858cdf5eb6b9945a46478f9876819c16bcd3 (patch) | |
tree | e36b987aa7d42918da6b905345b4af8250419a74 | |
parent | tests: Fix read past buffer. (diff) | |
download | libgpg-error-823e858cdf5eb6b9945a46478f9876819c16bcd3.tar.gz libgpg-error-823e858cdf5eb6b9945a46478f9876819c16bcd3.zip |
Fix windows 8bit encoding conversion
* src/w32-gettext.c (wchar_to_native): Convert to ConsoleOutputCP.
--
Just using CP_ACP did not neccessarily convert to the correct
codepage as codepages might differ between ConsoleOutput and
GUI output (which it usually does).
This fixes encoding issues on the Windows commandline.
-rw-r--r-- | src/w32-gettext.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/w32-gettext.c b/src/w32-gettext.c index 2eb0289..146de53 100644 --- a/src/w32-gettext.c +++ b/src/w32-gettext.c @@ -1373,17 +1373,25 @@ utf8_to_wchar (const char *string, size_t length, size_t *retlen) } -/* Return a malloced string encoded in UTF-8 from the wide char input - string STRING. Caller must free this value. On failure returns - NULL. The result of calling this function with STRING set to NULL +/* Return a malloced string encoded in the native console codepage + from the wide char input string STRING. + Caller must free this value. On failure returns NULL. + The result of calling this function with STRING set to NULL is not defined. */ static char * wchar_to_native (const wchar_t *string, size_t length, size_t *retlen) { int n; char *result; + unsigned int cpno = GetConsoleOutputCP (); + + /* GetConsoleOutputCP returns the 8-Bit codepage that should be used + for console output. If the codepage is not returned we fall back + to the codepage GUI programs should use (CP_ACP). */ + if (!cpno) + cpno = GetACP (); - n = WideCharToMultiByte (CP_ACP, 0, string, length, NULL, 0, NULL, NULL); + n = WideCharToMultiByte (cpno, 0, string, length, NULL, 0, NULL, NULL); if (n < 0 || (n+1) <= 0) return NULL; @@ -1391,7 +1399,7 @@ wchar_to_native (const wchar_t *string, size_t length, size_t *retlen) if (!result) return NULL; - n = WideCharToMultiByte (CP_ACP, 0, string, length, result, n, NULL, NULL); + n = WideCharToMultiByte (cpno, 0, string, length, result, n, NULL, NULL); if (n < 0) { jnlib_free (result); |