My guess is that you’ve told (Perl ...) that the text consists of utf-8, and that you are (or, it is) transferring the data in about-4096 byte chunks, and that a UTF-8 character sequence is being “cut in half” across that boundary. Well, it seems to me that if you said that the data was UTF-8, (Perl) is going to presume that every chunk is that way, and that every chunk is complete (which it is not). Perl therefore might try to “fix” the tail of one chunk, and/or it will be confused by the start of the next one.
So, I suggest that you tell (Perl) that the data-stream is binary, so that (Perl) won’t attempt to do anything to what it sees, until such time as you know that you have received and have concatenated-together the entire stream of data, chunk by chunk. This, and only this, ought to be a proper utf-8 stream ... which you can and should verify.
I put (Perl) in quotes since several different software agents could make this sort of mistake.