Что эквивалентно char (0) или '\ 0' для wchar_t? - PullRequest
0 голосов
/ 16 мая 2018
#include <iostream>
#include <locale>

int main(int argc, char** argv) {
    std::wcout.imbue(std::locale("zh_CN.UTF-8"));

    std::wcout << wchar_t(0) << L"哈哈" << std::endl;
    std::cout << char(0) << "haha" << std::endl;
    std::cout << "---------------" << std::endl;

    std::wcout.clear();
    std::wcout << L"哈哈" << std::endl;
    std::cout << "haha" << std::endl;
    std::cout << "---------------" << std::endl;

    std::wcout << L'\0' << L"哈哈" << std::endl;
    std::cout << '\0' << "haha" << std::endl;
    std::cout << "---------------" << std::endl;

    std::wcout.clear();
    std::wcout << L"哈哈" << std::endl;
    std::cout << "haha" << std::endl;

    return 0;
}

wchar_t(0) и L'\0', кажется, отличаются от char(0) и '\0' и приводят к тому, что ostream имеет плохое состояние.

Мне потребовалось некоторое время, чтобы выяснить, что пропущенный вывод вызван не настройкой локали, а wchar_t, поскольку моя оригинальная программа где-то выводит wchar_t(0) или '\0'.

Мой вопрос: чем они отличаются от версии char? А как правильно использовать пустую wchar_t?

Заранее спасибо.

1 Ответ

0 голосов
/ 16 мая 2018

Широкий нулевой символ может быть записан как wchar_t(0) или L'\0'.

Вы наблюдаете различное поведение, потому что cout и wcout являются текстовыми потоками .Согласно cppreference , вы должны использовать только печатные символы, \t и \n в текстовом потоке.Отправка нулевого символа в текстовый поток может привести к непредвиденным результатам.

Если вы хотите использовать cout в качестве двоичного потока в Windows, есть несколько способов, которые вы можете сделать, см. Здесь дляидеи.

Я не уверен, будут ли эти хаки работать на wcout;но из прошлого опыта состояние поддержки wcout в компиляторах сомнительно, и я считаю более надежным просто использовать stdout и выполнять любой необходимый перевод с использованием фасетов или явных функций и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...