ПрограммированиеФорумОбщее

Как считать с консоли utf8 текст? (C++)

Страницы: 1 2 Следующая »
#0
1:05, 25 сен 2015

В дальнейшем будет отправка на сервер...
Под "считать" я понимаю ввод прямо в консоль, а не из файла и т.п.

#1
1:30, 25 сен 2015

Из консоли получаешь простую строку, преобразуешь ее с помощью multibytetowidechar, получаешь utf8, делаешь с ним дальше что хочешь, в том числе и на сервер можешь отправлять.

#2
10:10, 25 сен 2015

Беда с этим Виндовсом... У меня в Лине вроде сразу utf8 )

#3
10:21, 25 сен 2015

преобразуешь ее с помощью multibytetowidechar

Скорее всё же WideCharToMultibyte. И консоль нужна юникодная.

#4
12:02, 25 сен 2015

Crazy Hamster
Как ее сделать юникодовской? Читать через wcin?

#5
13:41, 25 сен 2015

Crazy Hamster
> И консоль нужна юникодная.
А разве такая есть?

Crazy Hamster
> Скорее всё же WideCharToMultibyte
Нет-нет, именно multibytetowidechar. Надо же из ansii-строки получить utf8. multibytetowidechar и это умеет тоже, там флажок специальный есть для такой операции.

#6
13:52, 25 сен 2015

Zab
MultiByteToWideChar(CP_ACP, ....
но оно сконвертирует в utf16 а потом видимо надо обратно в мультибайт только UTF8

#7
14:04, 25 сен 2015

можете скинуть пример кода? Запутали меня :)

#8
15:34, 25 сен 2015

В винде ReadConsoleW даст UTF-16 строку, из него переводить в UTF-8 либо через WideCharToMultiByte, либо самому или другими библиотеками.
На других платформах уже везде UTF-8 сразу, хотя наверное может зависеть от установленной локали.

#9
16:45, 25 сен 2015

Можно попробовать

SetConsoleCP(65001); // UTF-8
SetConsoleOutputCP(65001); // UTF-8

Но я не гарантирую позитивных результатов.
У меня пока что получаются негативные.
(см. http://www.gamedev.ru/code/forum/?id=205901&page=2#m18 и далее).

#10
19:12, 25 сен 2015

Microsoft (чтобы жисть малиной не казалась) так и не сделала нормальной  поддержки UTF-8 локали. Так что надежно (например, чтобы пайпы работали) - скорее всего, никак.

#11
20:00, 25 сен 2015

vladislav
> Microsoft (чтобы жисть малиной не казалась) так и не сделала нормальной 
> поддержки UTF-8 локали. Так что надежно (например, чтобы пайпы работали) -
> скорее всего, никак.
Можно работать с M$ через UTF-16, а преобразовывать в UTF-8 WideCharToMultiByte умеет. Всё надёжно, хоть и не так удобно, как в линуксах, где UTF-8 из коробки.

#12
20:17, 25 сен 2015

gammaker
а как мне dir | <my_application> сделать, в юникоде (я с виндой давно не работал)?

#13
21:00, 25 сен 2015

gammaker
> Можно работать с M$ через UTF-16, а преобразовывать в UTF-8 WideCharToMultiByte
> умеет. Всё надёжно, хоть и не так удобно, как в линуксах, где UTF-8 из коробки.
Можно увидеть пример кода?

#14
11:41, 26 сен 2015

Laynos
> Можно увидеть пример кода?
Я конвертирую UTF-8 и UTF-16 сам, так что примера MultiByteToWideChar\WideCharToMultibyte у меня нету, а писать лень. Но тут же всё очевидно.
При работе с WinAPI вызываешь функции, которые оканчиваются на W. Например ReadConsoleW. Полученную строку преобразуешь в свой любимый UTF-8 с помощью WideCharToMultiByte с кодировкой CP_UTF8. Описание функции загугли, оно есть например на MSDN.
Ну наоборот аналогично преобразуешь строку из UTF-8 в UTF-16 с помощью MultiByteToWideChar с codepage CP_UTF8 и скармливаешь то, что получилось в функции, оканчивающиеся на W.
Про WinAPI-функции, оканчивающиеся на A вообще забудь и никогда их не вызывай.
Ещё вроде как можно даже конвертировать строку без WinAPI через mbstowcs/wcstombs. Но я не пробовал. Можешь тоже посмотреть их описание и использовать.

vladislav
> а как мне dir | <my_application> сделать, в юникоде (я с виндой давно не
> работал)?
А я вообще почти с консолью винды не работал. Даже не знаю, что символ | означает. Он перенаправляет вывод программы на консоль или как аргумент командной строки? В любом случае, если в обеих программах используются варианты функций, оканчивающихся на W, но всё происходит в Юникоде, который всегда можно преобразовать в UTF-8 и обратно, если нужно.

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.