diff -upr zsh-5.8.org/Src/utils.c zsh-5.8.mod/Src/utils.c --- zsh-5.8.org/Src/utils.c 2020-01-13 14:39:15.000000000 +0900 +++ zsh-5.8.mod/Src/utils.c 2021-01-31 09:15:59.741571000 +0900 @@ -7572,3 +7572,29 @@ mailstat(char *path, struct stat *st) return 0; } #endif + +#ifdef MULTIBYTE_SUPPORT +int hack_WC_ISPRINT(const char* s, size_t s_len) +{ + const size_t max_len = MB_CUR_MAX; + const size_t len = (s_len < max_len) ? s_len : max_len; + + wchar_t pwc[max_len]; + mbstate_t ps; + memset(&ps, 0, sizeof(ps)); + + const size_t ret_mbrtowc = mbrtowc(pwc, s, len, &ps); + + switch (ret_mbrtowc) { + case MB_INCOMPLETE: + return 0; + case MB_INVALID: + return 0; + case 0: + return 0; + default: + return ret_mbrtowc; + } + return 0; +} +#endif diff -upr zsh-5.8.org/Src/ztype.h zsh-5.8.mod/Src/ztype.h --- zsh-5.8.org/Src/ztype.h 2020-01-12 04:42:14.000000000 +0900 +++ zsh-5.8.mod/Src/ztype.h 2021-01-31 09:12:59.606155000 +0900 @@ -75,7 +75,8 @@ # ifdef ENABLE_UNICODE9 # define WC_ISPRINT(X) u9_iswprint(X) # else -# define WC_ISPRINT(X) iswprint(X) +extern int hack_WC_ISPRINT(const char* s, size_t s_len); +# define WC_ISPRINT(X) hack_WC_ISPRINT(&(X), sizeof(X)) # endif #else #define WC_ZISTYPE(X,Y) zistype((X),(Y))