Hello. I had similar/same problem that I have just fixed. Posting here as have not seen this solution in forum.
Before:

- ajaxcal 1.jpg (87.39 KiB) Viewed 8782 times
After:

- ajaxcal 2.jpg (87.95 KiB) Viewed 8782 times
You can see that the problem was specific to substr function, and it wasn't the problem with general encoding.
Solution was to change from substr to mb_substr function in functions.inc.php file. mb_substr is needed to be able to substring texts with multibyte encodings. No idea if this is good long-term solution (I am not much of a programmer) but it works now

43c43
< $weekday = mb_substr($lang["day_".$k.""],0,1,'utf-8');
---
> $weekday = substr($lang["day_".$k.""],0,1);
51,52c51,52
< if($k==7) $weekday = mb_substr($lang["day_0"][0],0,1,'utf-8');
< else $weekday = mb_substr($lang["day_".$k.""],0,1,'utf-8');
---
> if($k==7) $weekday = substr($lang["day_0"][0],0,1);
> else $weekday = substr($lang["day_".$k.""],0,1);
267c267