I also encoded some functions to handle typos in the keyboard layout. Here is the code:
proc fcmp outlib=sasuser.userfuncs.mystring; FUNCTION count_rus_letters(string $); length letter $2; rus_count=0; len=klength(string); do i=1 to len; letter=ksubstr(string,i,1); if letter in ("","","","","","","","","","","","","","","","" "","","","","","","","","","","","","","","","","","","","", "","","","","","","","","","","","","","","","","","","","" "","","","","","","","","","") then rus_count+1; end; return(rus_count); endsub; run; proc fcmp outlib=sasuser.userfuncs.mystring; FUNCTION count_eng_letters(string $); length letter $2; eng_count=0; len=klength(string); do i=1 to len; letter=ksubstr(string,i,1); if rank('A') <= rank(letter) <=rank('z') then eng_count+1; end; return(eng_count); endsub; run; proc fcmp outlib=sasuser.userfuncs.mystring; FUNCTION is_string_russian(string $); length letter $2 result 8; eng_count=0; rus_count=0; len=klength(string); do i=1 to len; letter=ksubstr(string,i,1); if letter in ("","","","","","","","","","","","","","","","" "","","","","","","","","","","","","","","","","","","","", "","","","","","","","","","","","","","","","","","","","" "","","","","","","","","","") then rus_count+1; if rank('A') <= rank(letter) <=rank('z') then eng_count+1; end; if rus_count>=eng_count then result=1; else result=0; return(result); endsub; run; proc fcmp outlib=sasuser.userfuncs.mystring; FUNCTION fix_layout_misprints(string $) $ 1000; length letter $2 result $1000; eng_count=0; rus_count=0; len=klength(string); do i=1 to len; letter=ksubstr(string,i,1); if letter in ("","","","","","","","","","","","","","","","" "","","","","","","","","","","","","","","","","","","","", "","","","","","","","","","","","","","","","","","","","" "","","","","","","","","","") then rus_count+1; if rank('A') <= rank(letter) <=rank('z') then eng_count+1; end; if rus_count>=eng_count then result=ktranslate(string,"","AaBEeKkMOoPpCcTXx"); else result=ktranslate(string,"AaBEeKkMOoPpCcTXx",""); return(result); endsub; run; options cmplib=sasuser.userfuncs; data _null_; good_str=""; err_str="a"; fixed_str=fix_layout_misprints(err_str); put "Good string=" good_str; put "Error string=" err_str; put "Fixed string=" fixed_str; rus_count_in_err=count_rus_letters(err_str); put "Count or Cyrillic symbols in error string=" rus_count_in_err; eng_count_in_err=count_eng_letters(err_str); put "Count or English symbols in error string=" eng_count_in_err; is_error_str_russian=is_string_russian(err_str); put "Is error string language Russian=" is_error_str_russian; if (good_str ne err_str) then put "Before clearing - strings are not equal to each other"; if (good_str = fixed_str) then put "After clearing - strings are equal to each other"; run;