#c #winapi #locale
#c #winapi #locale
Вопрос:
Я не совсем понимаю разницу между двумя функциями FormatMessageA() и FormatMessageW() . Понятно, что FormatMessageW() всегда будет выдавать правильное сообщение, независимо от языка в моей ОС.
Но что, если у меня есть язык, отличный от английского, должен ли FormatMessageA() по-прежнему выдавать мне правильный результат на английском языке?
У меня есть следующий код:
static std::string GetLastErrorAsString()
{
DWORD errorMessageID = ::GetLastError();
if (errorMessageID == 0)
{
return std::string();
}
LPSTR messageBuffer = nullptr;
size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)amp;messageBuffer, 0, NULL);
std::string message(messageBuffer, size);
LocalFree(messageBuffer);
return message;
}
Будет ли следующая функция корректно работать с любым языком в ОС?
Комментарии:
1. Что именно вы подразумеваете под «правильно»? И почему вы хотите использовать
FormatMessageA
в любом случае? Трудно представить вескую причину, чтобы предпочесть егоFormatMessageW
.2. Под «Правильно» я имею в виду, будет ли оно форматировать мне сообщение в ascii на любом языке ОС?
3.
FormatMessageA
сделайте то жеFormatMessageW
самое, что и, а затем вызовитеRtlUnicodeStringToAnsiString
. итак, по факту — ваш вопрос —RtlUnicodeStringToAnsiString
правильно ли конвертируется на любом языке? конечно, нет. не любой язык может быть преобразован в ansi.4. Почему вы хотите избежать
wchar_t
? Другими словами: почему вы хотите избежать решения, которое всегда будет давать правильный результат, использует меньше выделений памяти и дешевле в вычислительном отношении?5. Это произойдет, если доступны соответствующие языковые ресурсы. Но не без необходимости преобразования из UTF-16. Почему вы настаиваете на выполнении, возможно, с потерями и гарантированно более дорогостоящей операции? Какую проблему вы пытаетесь решить?