Copy function can not handle utf8 chars like ä,ü,ß, it counts 2 characters for those.
If an umlaut is in the last from copy-function calculated position then it intersects the character and results at the end '?'.
Look at the examples:
var s,s2:string;
begin
s:='Özßönkrsöäüänöüä';
s2:=Copy(s,1,6); // s2 is 'Özß?' , copy calculated ö at 6.char.
// it should be 'Özßönk'
s2:=Copy(s,1,7); // s2 is 'Özßö'
// it should be 'Özßönkr'
Is in the RTL a function that can copy strings right way?