A site on Asp.Net MVC using Razor. Periodically in random places there are such question marks, while the rest of the Russian text is displayed normally.

The position of these characters depends on the content of the page: if the content in front of the character changes even by the byte, the character either disappears or moves. If the content to this sign does not change, then it stably shows with each page refresh. Obviously, it appears with some kind of deformation of double-byte characters. In encodings everywhere UTF-8 is exposed.
There is an assumption that for some reason the bytes deteriorate at the junction of two TCP packets. I know that TCP is a transport-level protocol that ensures integrity and continuity of data at the top level, but I haven’t found another explanation. As well as I did not find the reason why TCP can spoil the joints of packets.
The problem manifests itself on different servers with the same site (transported a couple of times), and even on different sites created independently from scratch from standard templates.
UPD
An example of a broken line: Not processed.
Bytes of the same string:
0xD0, 0x9D, 0xD0, 0xB5, 0x20, 0xD0, 0xBE, 0xD0, 0xB1, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xB1, 0xD0, 0xBE, 0xB1, 0xD0, 0xBE, 0xB0, 0xD0, 0xBE, 0xD0, 0xB1, 0xD0, 0xB1, 0xD0, 0xB1, 0xD0, 0xB1, 0xD0
Here you can see that in the first case, the letter "a" is encoded 0xD0, 0xB0, and in the second (broken) case, 0xB0, 0xD0. For some reason, the bytes are swapped.