diff --git a/src/backend/tsearch/wparser_def.c b/src/backend/tsearch/wparser_def.c
index fa73dff694bd510aeaf4ba16fd41153da01dc514..67282121411fc547729ba1aaefb83d87c17dfbb5 100644
--- a/src/backend/tsearch/wparser_def.c
+++ b/src/backend/tsearch/wparser_def.c
@@ -432,7 +432,7 @@ TParserCopyClose(TParser *prs)
  *	  or give wrong result.
  *	- multibyte encoding and C-locale often are used for
  *	  Asian languages.
- *	- if locale is C the we use pgwstr instead of wstr
+ *	- if locale is C then we use pgwstr instead of wstr.
  */
 
 #ifdef USE_WIDE_UPPER_LOWER
@@ -444,9 +444,13 @@ p_is##type(TParser *prs) {													\
 	if ( prs->usewide )														\
 	{																		\
 		if ( prs->pgwstr )													\
-			return is##type( 0xff & *( prs->pgwstr + prs->state->poschar) );\
-																			\
-		return isw##type( *(wint_t*)( prs->wstr + prs->state->poschar ) );	\
+		{																	\
+			unsigned int c = *(prs->pgwstr + prs->state->poschar);			\
+			if ( c > 0x7f )													\
+				return 0;													\
+			return is##type( c );											\
+		}																	\
+		return isw##type( *( prs->wstr + prs->state->poschar ) );			\
 	}																		\
 																			\
 	return is##type( *(unsigned char*)( prs->str + prs->state->posbyte ) ); \
@@ -475,10 +479,10 @@ p_isalnum(TParser *prs)
 			if (c > 0x7f)
 				return 1;
 
-			return isalnum(0xff & c);
+			return isalnum(c);
 		}
 
-		return iswalnum((wint_t) *(prs->wstr + prs->state->poschar));
+		return iswalnum(*(prs->wstr + prs->state->poschar));
 	}
 
 	return isalnum(*(unsigned char *) (prs->str + prs->state->posbyte));
@@ -507,10 +511,10 @@ p_isalpha(TParser *prs)
 			if (c > 0x7f)
 				return 1;
 
-			return isalpha(0xff & c);
+			return isalpha(c);
 		}
 
-		return iswalpha((wint_t) *(prs->wstr + prs->state->poschar));
+		return iswalpha(*(prs->wstr + prs->state->poschar));
 	}
 
 	return isalpha(*(unsigned char *) (prs->str + prs->state->posbyte));