キーボードレイアウトが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.