キーボードレイアウトがUSのとき、日本語文字列をクリップボードにコピーしたとき文字化けが発生する
Open Date: 2012-11-05 12:45
Letztes Update: 2012-12-07 17:46
Reporter: | comutt | Eigentümer: | maya |
---|---|---|---|
Priority: | 5 - Medium | MileStone: | (None) |
Type: | Bugs | Severity: | 5 - Medium |
Component: | Tera Term | Status: | Closed |
Resolution | Fixed |
Details
キーボードレイアウトがUSに設定されているとき、 日本語を含む文字列をコピーすると、 ペースト時に文字化けが発生します。
下記の環境で確認しました。 Windows XP Professional SP3 (日本語版) Windows 7 Professional SP1 (日本語版)
以下のコンソール文字列の場合:
[sys-user@gateway ~]$ date Mon Nov 5 12:34:11 JST 2012 [sys-user@gateway ~]$ LANG=ja_JP.UTF-8 date 2012年 11月 5日 月曜日 12:34:14 JST
結果:
[sys-user@gateway ~]$ date Mon Nov 5 12:34:11 JST 2012 [sys-user@gateway ~]$ LANG=ja_JP.UTF-8 date 2012”N 11ŒŽ 5“ú ŒŽ—j“ú 12:34:14 JST
最新版 trunk を取得し、調査をしてみました。 また、PuTTYでは発生しないため(PuTTYである必要はないですが)PuTTYのコピー処理とも見比べてみました。
PuTTY では、以下のコピー処理となっていました。(抜粋)
/* * File: window.c */voidwrite_clip(void *frontend, wchar_t * data, int *attr, int len, int must_deselect) { HGLOBAL clipdata, clipdata2, clipdata3;int len2;void *lock, *lock2, *lock3; len2 = WideCharToMultiByte(CP_ACP, 0, data, len, 0, 0, NULL, NULL); clipdata = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, len * sizeof(wchar_t)); clipdata2 = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, len2);/*** snip ***/if (OpenClipboard(hwnd)) { EmptyClipboard(); SetClipboardData(CF_UNICODETEXT, clipdata); SetClipboardData(CF_TEXT, clipdata2);if (clipdata3) SetClipboardData(RegisterClipboardFormat(CF_RTF), clipdata3); CloseClipboard(); } else { GlobalFree(clipdata); GlobalFree(clipdata2); }if (!must_deselect) SendMessage(hwnd, WM_IGNORE_CLIP, FALSE, 0); }
TeraTermの処理は、CF_TEXT への set のみとなっているため、CF_UNICODETEXT をセットするようにしたところ、 うまくいきました。(PuTTY とは逆に、MultiByteToWideCharしました)
自分が試したコードのパッチを下記に記載いたします。
Index: trunk/teraterm/teraterm/clipboar.c===================================================================--- trunk/teraterm/teraterm/clipboar.c (revision 5057)+++ trunk/teraterm/teraterm/clipboar.c (working copy)@@ -67,6 +67,10 @@ void CBClose() { BOOL Empty;+ HGLOBAL CBCopyWideHandle = NULL;+ LPWSTR CBCopyWidePtr = NULL;+ int WideCharLength;+ if (CBCopyHandle==NULL) { return; }@@ -76,6 +80,14 @@ Empty = (CBCopyPtr[0]==0); }+ WideCharLength = MultiByteToWideChar(CP_ACP, 0, CBCopyPtr, -1, NULL, 0);+ CBCopyWideHandle = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * WideCharLength);+ if (CBCopyWideHandle) {+ CBCopyWidePtr = (LPWSTR)GlobalLock(CBCopyWideHandle);+ MultiByteToWideChar(CP_ACP, 0, CBCopyPtr, -1, CBCopyWidePtr, WideCharLength);+ GlobalUnlock(CBCopyWideHandle);+ }+ GlobalUnlock(CBCopyHandle); CBCopyPtr = NULL;@@ -83,10 +95,17 @@ EmptyClipboard(); if (! Empty) { SetClipboardData(CF_TEXT, CBCopyHandle);+ if (CBCopyWidePtr) {+ SetClipboardData(CF_UNICODETEXT, CBCopyWideHandle);+ } } CloseClipboard(); } CBCopyHandle = NULL;++ if (CBCopyWideHandle) {+ GlobalFree(CBCopyWideHandle);+ } } void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed,
なにぶんC言語とWindows開発に慣れていないもので、 上記のコードが適切でないかもしれません。
受け入れ可能な状態に修正していただき、取り込んでいただけると幸いです。
なお、修正版は下記の環境でコピー機能の正常動作を確認しました。 * ビルド環境: Visual Studio 2010 Professional SP1 * 実行環境:
- Windows 7 Professional SP1 (日本語版)
- Windows XP Professional SP3 (日本語版)
Last Update of this Ticket
2012-12-07 17:46 Update by: maya
- Milestone Update from Tera Term 4.76 (closed) to (None).
- Ticket Close date set to 2012-12-07 17:46
- Status Update from Open to Closed.