--- tkWinMenu.c,orig	Sun Jun 10 01:27:25 2007
+++ tkWinMenu.c	Sun Jun 10 01:22:53 2007
@@ -1042,15 +1042,25 @@
 
 
 	case WM_MENUCHAR: {
-	    unsigned char menuChar = (unsigned char) LOWORD(*pwParam);
 	    hashEntryPtr = Tcl_FindHashEntry(&tsdPtr->winMenuTable, 
                     (char *) *plParam);
 	    if (hashEntryPtr != NULL) {
 		int i, len, underline;
 		Tcl_Obj *labelPtr;
+		TCHAR menuChar;
+		Tcl_DString dStr;
+		const char *pUtfMenuChar, *pUnderlinedChar;
 
-		*plResult = 0;
 		menuPtr = (TkMenu *) Tcl_GetHashValue(hashEntryPtr);
+
+		if (menuPtr->numEntries > 0) {
+		    menuChar = (TCHAR) LOWORD(*pwParam);
+		    Tcl_DStringInit(&dStr);
+		    pUtfMenuChar = Tcl_WinTCharToUtf(&menuChar,
+			    sizeof(TCHAR), &dStr);
+		}
+
+		*plResult = 0;
 		for (i = 0; i < menuPtr->numEntries; i++) {
 		    underline = menuPtr->entries[i]->underline;
 		    labelPtr = menuPtr->entries[i]->labelPtr;
@@ -1058,11 +1068,11 @@
 			/* do the unicode call just to prevent overruns */
 			Tcl_GetUnicodeFromObj(labelPtr, &len);
 			if (underline < len) {
-			    char *label;
+			    const char *label;
 			    label = Tcl_GetStringFromObj(labelPtr, NULL);
-			    if (CharUpper((LPTSTR) menuChar)
-				    == CharUpper((LPTSTR)
-					*Tcl_UtfAtIndex(label, underline))) {
+			    pUnderlinedChar = Tcl_UtfAtIndex(label, underline);
+			    if (Tcl_UtfNcasecmp(pUtfMenuChar,
+					pUnderlinedChar, 1) == 0) {
 				*plResult = (2 << 16) | i;
 				returnResult = 1;
 				break;
@@ -1070,6 +1080,10 @@
 			}
 		    }
 		}
+
+		if (menuPtr->numEntries > 0) {
+		    Tcl_DStringFree(&dStr);
+		}
 	    }
 	    break;
 	}
