Ввод юникод-символов с консоли (Windows)

Предыдущая тема Следующая тема Перейти вниз

Ввод юникод-символов с консоли (Windows)

Сообщение  Замабувараев в Пн Ноя 04, 2013 8:58 am

Для того, чтобы воспользоваться юникодовыми строками (как-никак, уже двадцать первый век на дворе), необходимо использовать в своих программах тип WString. Однако вводить с консоли юникодовые строки Васик не умеет. Поэтому есть грязный хак с использованием высокоуровневой Windows-функции чтения с консоли ReadConsole, устраняющий сие недоразумение.

Для начала необходимо включить режим UNICODE вот так:

Код:

#define unicode
Этот дефине необходимо написать самым первым, перед подключением заголовочных файлов. Замечание. Все работающие со строками Win-API-функции имеются в двух вариантах: UNICODE (двухбайтная кодировка) и ANSI (однобайтная кодировка), что отражено в названиях функий. Юникодовые функции заканчиваются символом W, а ANSI — символом A. Также необходимо помнить, что все ANSI-функции — это лишь обёртка над юникодовыми функциями, и для своей работы они вызывают перекодировщик из текущей кодовой страницы в юникод. Объявив константу «unicode», мы даём указание Васику все строковые функции вызывать с буквой W на конце.
Также после объявления константы не забываем подключить заголовочный файл Windows.

Код:

#include "windows.bi"
Затем создаём юникодовый буфер чтения с консоли, то есть это должен быть либо WString либо WString Ptr.

Код:

Dim strBuffer As WString*(1024*32)
Далее получаем стандартные дескрипторы ввода-вывода.

Код:

Dim InHandle As HANDLE = GetStdHandle(STD_INPUT_HANDLE)
На самом деле дескриптор вывода не нужен, так как встроенная функция Print умеет выводить юникод-строки в консоль. Эту строку можно закомментировать.

Код:

Dim OutHandle As HANDLE = GetStdHandle(STD_OUTPUT_HANDLE)
Дальше нам необходимо количество действительно прочтённых символов:

Код:

Dim intSymbolsCount As Integer
Теперь можно читать с консоли текст функцией ReadConsole (помним, что на самом деле вызывается функция ReadConsoleW, так как мы указали соответствующую константу).
Параметры этой функции означают следующее:
hConsolelnput – дескриптор входного потока консоли.
IpBuffer – указатель на строку, в которую будет записана вводимая строка символов.
nNumberOfCharsToRead – размер буфера, указанного lpBuffer, делим пополам и вычитаем пару байт.
ipNumberOfCharsRead – количество действительно введенных символов (нужно передать адрес этой переменной).
lpReserved – зарезервировано, должно быть 0.

Код:

ReadConsole(InHandle, @strBuffer, 1024*16, @intSymbolsCount, 0)


Теперь в переменной intSymbolsCount содержится количество прочтённых символов

Код:

Print("Количество прочтённых символов " & Wstr(intSymbolsCount))
' Печатаем то, что мы получили на экран
Print(strBuffer)
Наконец, используем функцию WriteConsole (то есть WriteConsoleW), но это необязательно, так как мы уже имеем встроенную рабочую функцию Print.
Параметры этой функции означают следующее:
hConsoleOutput – дескриптор выходного потока консоли.
lpBuffer – указатель на выводимую строку.
nNumberOfCharsToWrite – размер буфера, указанного IpBuffer.
IpNumberOfCharsWritten – количество действительно выведенных символов.
lpReserved – зарезервировано, должно быть 0.

Код:

WriteConsole(OutHandle, @strBuffer, 32766, @intSymbolsCount, 0)
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 33
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения