diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-01-14 13:44:17 +0300 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-01-14 13:44:17 +0300 |
commit | 36101d6f43f1b4fdcacc16eb5abaa8589271f5b3 (patch) | |
tree | 897aee9d2fdb332cc0e0c90619182dd6e24184d1 /common | |
parent | 1013c924a821771be6326c3988d3533f09849a11 (diff) |
Parse strings as ANSI when UTF8 fails
This may help to parse "wrong" metadata in some files.
Diffstat (limited to 'common')
-rw-r--r-- | common/DSUtilLite/DShowUtil.cpp | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/common/DSUtilLite/DShowUtil.cpp b/common/DSUtilLite/DShowUtil.cpp index ff5377c8..ffea3fe3 100644 --- a/common/DSUtilLite/DShowUtil.cpp +++ b/common/DSUtilLite/DShowUtil.cpp @@ -202,6 +202,13 @@ int SafeMultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, if (len == cchWideChar || (len == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER)) { lpWideCharStr[cchWideChar - 1] = 0; } else if (len == 0) { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_NO_UNICODE_TRANSLATION && CodePage == CP_UTF8) { + return SafeMultiByteToWideChar(CP_ACP, dwFlags, lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar); + } + else if (dwErr == ERROR_NO_UNICODE_TRANSLATION && (dwFlags & MB_ERR_INVALID_CHARS)) { + return SafeMultiByteToWideChar(CP_UTF8, (dwFlags & ~MB_ERR_INVALID_CHARS), lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar); + } lpWideCharStr[0] = 0; } } @@ -230,6 +237,15 @@ LPWSTR CoTaskGetWideCharFromMultiByte(UINT CodePage, DWORD dwFlags, LPCSTR lpMul return pszWideString; } + else { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_NO_UNICODE_TRANSLATION && CodePage == CP_UTF8) { + return CoTaskGetWideCharFromMultiByte(CP_ACP, dwFlags, lpMultiByteStr, cbMultiByte); + } + else if (dwErr == ERROR_NO_UNICODE_TRANSLATION && (dwFlags & MB_ERR_INVALID_CHARS)) { + return CoTaskGetWideCharFromMultiByte(CP_UTF8, (dwFlags & ~MB_ERR_INVALID_CHARS), lpMultiByteStr, cbMultiByte); + } + } return NULL; } @@ -251,18 +267,9 @@ BSTR ConvertCharToBSTR(const char *sz) if (!sz || strlen(sz) == 0) return nullptr; - int len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, sz, -1, nullptr, 0); - if (len == 0) { - acp = true; - len = MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, sz, -1, nullptr, 0); - if (len == 0) - return nullptr; - } - - WCHAR *wide = (WCHAR *)CoTaskMemAlloc(len * sizeof(WCHAR)); + WCHAR *wide = CoTaskGetWideCharFromMultiByte(CP_UTF8, MB_ERR_INVALID_CHARS, sz, -1); if (!wide) return nullptr; - MultiByteToWideChar(acp ? CP_ACP : CP_UTF8, MB_ERR_INVALID_CHARS, sz, -1, wide, len); BSTR bstr = SysAllocString(wide); CoTaskMemFree(wide); |