You are confused. A C char certainly cannot hold an arbitrary UTF-8 encoded character. The reason that your file copy worked is because at each stage the char variable had some PART of a UTF-8 character.