Должен ли FormatMessageA() правильно форматировать сообщение даже в ОС Unicode?

#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. Почему вы настаиваете на выполнении, возможно, с потерями и гарантированно более дорогостоящей операции? Какую проблему вы пытаетесь решить?