char.ToLower and char.ToUpper do not handle all characters. Find the raw unicode tables and turn them into proper implementations.