Quantcast
Channel: All Open Tickets - Tera Term on OSDN
Viewing all articles
Browse latest Browse all 2128

キーボードレイアウトがUSのとき、日本語文字列をクリップボードにコピーしたとき文字化けが発生する - Tera Term Ticket #30015 on SourceForge.JP

$
0
0

キーボードレイアウトがUSのとき、日本語文字列をクリップボードにコピーしたとき文字化けが発生する

Open Date: 2012-11-05 12:45

Letztes Update: 2012-12-07 17:46

Reporter:comuttEigentümer:maya
Priority:5 - MediumMileStone:(None)
Type:BugsSeverity:5 - Medium
Component:Tera TermStatus:Closed
ResolutionFixed

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.

Viewing all articles
Browse latest Browse all 2128