客户端和服务器通过TCP相互通信。服务器和客户端互相发送UTF-8编码消息。
编码UTF-8时,每个字符的字节数是可变的。它可能需要一个或多个字节来表示单个字符。
让我们说我正在网络流上读取UTF-8编码的消息,这是一个巨大的信息。在我的情况下,它大约是145k字节。要创建此大小的缓冲区以从网络流中读取,可能会导致OutMemoryException,因为字节数组需要大量的顺序内存。
最好在while循环中读取网络流,直到读取整个消息,将片段读入较小的缓冲区(可能是4kb),然后解码字符串并连接。
我想知道当读缓冲区的最后一个字节实际上是由多个字节表示的字符的字节之一时会发生什么。当我解码读缓冲区时,最后一个字节和下一个读取的开始字节将无效或者字符错误。在我脑海中解决这个问题的最快方法是使用非变量编码(如UTF-16)进行编码,然后使缓冲区成为每个字符中字节数的倍数(使用UTF-16作为缓冲区)功率2,UTF-32的功率为4)。
但UTF-8似乎是一种常见的编码,这让我相信这是一个已解决的问题。除了更改编码之外,还有其他方法可以解决我的问题吗?也许使用链表类型对象来存储字节将是处理它的方法,因为它不会使用顺序存储器。
答案 0 :(得分:0)
这是一个已解决的问题。 Woot woot!
http://mikehadlow.blogspot.com/2012/07/reading-utf-8-characters-from-infinite.html