Revision: 9143 https://osdn.net/projects/ttssh2/scm/svn/commits/9143 Author: zmatsuo Date: 2021-01-30 00:35:36 +0900 (Sat, 30 Jan 2021) Log Message: ----------- 9x系でロシア語キーボードからの入力が正しくできるよう修正 Modified Paths: -------------- trunk/teraterm/teraterm/vtwin.cpp -------------- next part -------------- Modified: trunk/teraterm/teraterm/vtwin.cpp =================================================================== --- trunk/teraterm/teraterm/vtwin.cpp 2021-01-29 15:35:22 UTC (rev 9142) +++ trunk/teraterm/teraterm/vtwin.cpp 2021-01-29 15:35:36 UTC (rev 9143) @@ -1431,6 +1431,11 @@ } } +/** + * \x83L\x81[\x83{\x81[\x83h\x82\xA9\x82\xE71\x95\xB6\x8E\x9A\x93\xFC\x97\xCD + * @param nChar UTF-16 char(wchar_t) IsWindowUnicode() == TRUE \x8E\x9E + * ANSI char(char) IsWindowUnicode() == FALSE \x8E\x9E + */ void CVTWindow::OnChar(WPARAM nChar, UINT nRepCnt, UINT nFlags) { unsigned int i; @@ -1444,31 +1449,35 @@ return; } -#if UNICODE_INTERNAL_BUFF + wchar_t u16; + if (IsWindowUnicode(HVTWin) == TRUE) { + // \x93\xFC\x97͂\xCD UTF-16 + u16 = (wchar_t)nChar; + } else { + // \x93\xFC\x97͂\xCD ANSI, ANSI(ACP) -> UTF-32 -> UTF-16 + char mb_str[1]; + unsigned int u32; + mb_str[0] = (char)nChar; + size_t u32_len = MBCPToUTF32(mb_str, 1, CP_ACP, &u32); + if (u32_len == 0) { + return; + } + wchar_t u16_str[2]; + size_t u16_len = UTF32ToUTF16(u32, u16_str, _countof(u16_str)); + if (u16_len == 0) { + return; + } + u16 = u16_str[0]; + } + + // \x83o\x83b\x83t\x83@\x82֏o\x97́A\x89\xE6\x96ʂ֏o\x97\xCD for (i=1 ; i<=nRepCnt ; i++) { - wchar_t u16 = nChar; CommTextOutW(&cv,&u16,1); if (ts.LocalEcho>0) { CommTextEchoW(&cv,&u16,1); } } -#else - { - char Code = nChar; - if ((ts.Language==IdRussian) && - ((BYTE)Code>=128)) { - Code = (char)RussConv(ts.RussKeyb,ts.RussClient,(BYTE)Code); - } - for (i=1 ; i<=nRepCnt ; i++) { - CommTextOut(&cv,&Code,1); - if (ts.LocalEcho>0) { - CommTextEcho(&cv,&Code,1); - } - } - } -#endif - // \x83X\x83N\x83\x8D\x81[\x83\x8B\x88ʒu\x82\xF0\x83\x8A\x83Z\x83b\x83g if (WinOrgY != 0) { DispVScroll(SCROLL_BOTTOM, 0);