diff --git a/libs/main/console/pikbdlistener.cpp b/libs/main/console/pikbdlistener.cpp index 8de218d2..c20c53ef 100644 --- a/libs/main/console/pikbdlistener.cpp +++ b/libs/main/console/pikbdlistener.cpp @@ -323,12 +323,18 @@ void PIKbdListener::readKeyboard() { for (int i = 0; i < PRIVATE->ret; ++i) PICout(0) << PICoutManipulators::Hex << int(((uchar * )&rc)[i]) << ' '; PICout(0) << "\n"; + std::cout << PRIVATE->ret << " chars "; for (int i = 0; i < PRIVATE->ret; ++i) - cout << "'" << (char)(rc[i]) << "' "; - cout << endl;*/ + std::cout << "'" << (char)(rc[i]) << "' " << (int)(uchar)(rc[i]); + std::cout << std::endl;*/ if (rc[0] == 0) {piMSleep(10); return;} if (PRIVATE->ret < 0 || PRIVATE->ret > 7) {piMSleep(10); return;} - if (PRIVATE->ret == 1) ke.key = PIChar::fromConsole(rc[0]).unicode16Code(); + if (PRIVATE->ret == 1) { + if (rc[0] == 8) + ke.key = Backspace; + else + ke.key = PIChar::fromConsole(rc[0]).unicode16Code(); + } int mod(0); // 2 - shift 1 // 3 - alt 2 diff --git a/libs/main/core/picout.cpp b/libs/main/core/picout.cpp index 3fcd5e91..b6d99526 100644 --- a/libs/main/core/picout.cpp +++ b/libs/main/core/picout.cpp @@ -22,6 +22,10 @@ #include "pistack.h" #include "piobject.h" #include "pistring_std.h" +#ifdef HAS_LOCALE +# include +# include +#endif #ifdef WINDOWS # include # include @@ -147,6 +151,9 @@ PRIVATE_DEFINITION_START(PICout) static WORD dattr; static DWORD smode; #endif +#ifdef HAS_LOCALE + std::wstring_convert, char16_t> utf8conv; +#endif PRIVATE_DEFINITION_END(PICout) #ifdef WINDOWS @@ -539,8 +546,13 @@ PICout & PICout::writePIString(const PIString & s) { if (buffer_) { buffer_->append(s); } else { + if (PICout::isOutputDeviceActive(PICout::StdOut)) { +#ifdef HAS_LOCALE + std::cout << PRIVATE->utf8conv.to_bytes((char16_t*)&(const_cast(s).front()), (char16_t*)&(const_cast(s).front()) + s.size()); +#else for (PIChar c: s) std::wcout.put(c.toWChar()); +#endif } if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__().append(s); } diff --git a/libs/main/core/piinit.cpp b/libs/main/core/piinit.cpp index 37f6d1b3..1e04d086 100644 --- a/libs/main/core/piinit.cpp +++ b/libs/main/core/piinit.cpp @@ -152,12 +152,15 @@ PIInit::PIInit() { } # endif //WINDOWS # ifdef HAS_LOCALE - //cout << "has locale" << endl; + //std::cout << "has locale" << std::endl; if (currentLocale_t != 0) { freelocale(currentLocale_t); currentLocale_t = 0; } currentLocale_t = newlocale(LC_ALL, setlocale(LC_ALL, ""), 0); + //std::ios_base::sync_with_stdio(false); + //std::locale utf8( std::locale(), new std::codecvt_utf8 ); + //std::wcout.imbue(utf8); # else //HAS_LOCALE setlocale(LC_ALL, ""); setlocale(LC_NUMERIC, "C"); @@ -212,9 +215,6 @@ PIInit::PIInit() { if (gethostname(cbuff, 1023) == 0) { sinfo->hostname = cbuff; } -// std::ios_base::sync_with_stdio(false); -// std::locale utf8( std::locale(), new std::codecvt_utf8 ); -// std::wcout.imbue(utf8); #ifdef WINDOWS SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); diff --git a/main.cpp b/main.cpp index 057e06ab..c854f400 100644 --- a/main.cpp +++ b/main.cpp @@ -4,8 +4,30 @@ static const char * smallstr = "abcdef"; static const char * bigstr = "zsxdcgfhvbncjdbasljcvavcjadnwnxudvbabdhjlavudvdaljsvclavjlasdhvcjhldsavhjldasvfjlhsavdjhavdjhvfjhldasvfjlasvfhjldasvfhjasvfdjdasfhvjldasvhfjlasvfhjlahsvdfhjfvfvdjalsvfjlhasdvfdjsalvfhhjldasvfdjhaldsvfhjdvsfjhlavfjhlavfladlsvfjlasdvfdhjlavfhjldasvfhjlavfhjldvfhjlalsdvfjlhvasfhjlvchjlavchjladvchjldladvschjlladscvjlhdcahjchjllcahjllvcdjladsvhldbcljadsbcjdhlsachjlvdsa hjlcldajc hljdascbhaldb cldhashd l cajlhs chdsbfhlbfdasdffadsfjkbfkjldsabflhbcldhsbhclabchljadsbchldahsbcladsbhclhabhasbclasbdhl"; +PIKbdListener kbd; +#include +#include int main(int argc, char * argv[]) { + auto rstr = PIString::fromUTF8("ascii русский!"); + /*for (PIChar c: rstr) + std::wcout << c.toWChar(); + std::wcout << std::endl;*/ + piCout << rstr; + + /*char rs[] = "й"; + piCout << PIString(PIChar::fromUTF8(rs)); + std::cout << sizeof(rs) << " chars "; + for (int i = 0; i < sizeof(rs); ++i) + std::cout << "'" << (char)(rs[i]) << "' " << (int)(uchar)(rs[i]); + std::cout << std::endl; + CONNECTL(&kbd, keyPressed, ([](PIKbdListener::KeyEvent k, void*){ + ; + piCout << k.key << PIChar((ushort)k.key); + })); + kbd.start(); + WAIT_FOR_EXIT;*/ + return 0; static const int cc = 1000000; PITimeMeasurer tm; int l = 0;