2016-10-06 1 views
0

Я пытаюсь использовать WriteConsoleOutput из WinApi для записи символов в буфер окна командной строки. Дело в том, что я действительно хотел бы писать такие символы, как , прямо в исходный код, как есть, вместо того, чтобы использовать какую-то кодировку/обозначение вроде '\uFFFF' или '0xFF', так как я их тоже не понимаю (различия между кодовыми страницами/наборами символов и т. д.)Запись символа юникода (?) Непосредственно из исходного кода в WriteConsoleOutput

Код ниже демонстрирует простейшую форму моей проблемы. Выполнение этого кода не печатает в окне командной строки, а вопросительный знак (?).

#include <Windows.h> 

int main() 
{ 
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); 
    CHAR_INFO c[1] = {0}; 
    COORD cS = {1, 1}; 
    COORD cH = {0, 0}; 
    SMALL_RECT sr = {0, 0, 0, 0}; 

    c[0].Attributes = FOREGROUND_INTENSITY; 
    c[0].Char.UnicodeChar = '☺'; 
    WriteConsoleOutput(h, c, cS, cH, &sr); 
    Sleep(5000); 
    return 0; 
} 

Это жизненно важно для моего кода для вывода на экран одинаково между всеми версиями Windows, независимо от установленных языков и б/у. Насколько мне известно (что, по общему признанию, абсолютно минимально), мне нужно будет установить определенную кодовую страницу (которая, надеюсь, будет поддерживаться командной строкой на любом языке Windows).

Я пробовал:
• Переход от использования CHAR_INFO.UnicodeChar к CHAR_INFO.AsciiChar
в • возился вокруг с SetConsoleCPSetConsoleOutputCP и функций, но у меня нет ни малейшего понятия о том, как использовать их, чтобы помочь мне с этой проблемой.
• Изменение Visual Studio -> Проект -> Свойства проекта .. -> Набор символов настройка на все возможные значения.
• В дополнение к вышеупомянутым настройкам WriteConsoleOutputA или WriteConsoleOutputW
• Изменение кодировки файла исходного кода на UTF-8 с (/ out) сигнатурой.


В моем проекте я программная настройка командной строки шрифта 8x8 Terminal, который, насколько мне известно, не поддерживает фактические символы Юникода. Доступные символы отображаются here. Эти символы включают «☺», поэтому я не совсем уверен, что мой вопрос касается юникода. Я понятия не имею. Пожалуйста помоги.

+2

Вам нужно будет использовать c [0] .Char.UnicodeChar = L'☺ '; И убедитесь, что компилятор понимает ваш исходный код, используйте File> Advanced Save Options> select «Unicode (UTF-8 с подписью) - Codepage 65001». Выпущенную сейчас спецификацию достаточно, чтобы компилятор знал, что исходный код закодирован в utf8. –

+0

@ hans-passant Это дает мне ':' (двоеточие) вместо смайлика. Даже с кодировкой, сохраненной как UTF-8. – user6003859

+1

Символ U + 263A, 3A == ':'.L важен. –

ответ

1

Источник C должен быть только ascii. Если вы вставляете символы не-ascii в исходный файл C, а среда IDE может отображать их в том, что представляется правильным, но компилятор, скорее всего, относится к ним по-разному, а исполняемая функция, с которой вы их передаете, может обрабатывать их по-другому. Это просто не переносимо и не надежно. Но вы можете использовать escape-последовательность \ x для встраивания произвольных байтов в строки C.

UTF-8 хорош для внутреннего использования, но Windows API еще не поддерживают его, поэтому вам нужно преобразовать в 16-разрядные символы Windows (UTF-16 почти, но не совсем), чтобы отображать расширенные символы. Однако вы должны убедиться, что вы вызываете широкоформатную версию Windows API. Большинство функций Windows API, которые берут строку, входят в версию A и W (ascii и wide) для обратной совместимости двоичных файлов. Если вы запросите идентификатор в IDE (перейдите к определению и т. Д.), Вы увидите, какую версию у вас есть.

Смежные вопросы