C# 以字节形式读取UTF16
tl;dr如何使用C# 以字节形式读取UTF16,c#,.net,character-encoding,C#,.net,Character Encoding,tl;dr如何使用stream.ReadByte()读取可变长度编码文本 长版本: 我试图读取一个包含一些文本和二进制数据的文件。这在使用类似于StreamReaders的方法时产生了问题,因此我正在读取字节并将其转换为文本。只要文本是ASCII,这就很简单,因为一个字节转换成一个字符 但是,当已知文本以UTF16编码时,字符的长度是可变的。因此,我如何使用stream.ReadByte()并将其转换为UTF16?感谢注释的帮助,在对的回答中,我现在知道,由于所有文本都是行,所以我只需读取2个字
stream.ReadByte()
读取可变长度编码文本
长版本:
我试图读取一个包含一些文本和二进制数据的文件。这在使用类似于StreamReader
s的方法时产生了问题,因此我正在读取字节并将其转换为文本。只要文本是ASCII,这就很简单,因为一个字节转换成一个字符
但是,当已知文本以UTF16编码时,字符的长度是可变的。因此,我如何使用
stream.ReadByte()
并将其转换为UTF16?感谢注释的帮助,在对的回答中,我现在知道,由于所有文本都是行,所以我只需读取2个字节并检查它们是否为“\n”。UTF16不会是“\n”作为代理项对的一部分。UTF16编码的文本在长度上与ascii编码的文本相同。你把注意力集中在错误的问题上,一次解码一个字节、一个字符或一个代码点是不明智的。编码.GetString()需要字节[],无论您如何摆动该cat。@使用ASCII的HansPassant我只是读取字节,直到一个字节等于'\n'
的ACII值。然后我将所有这些字节馈送到GetString
。对于UTF,我没有(简单的)方法来检查行尾。对于UTF-16,这一点都不不同,请使用ReadUInt16()。包含2个元素的代码点永远不会与“\n”匹配。@HansPassantutf16编码的文本在长度上的变化与ascii编码的文本相同。
-你是什么意思?ASCII是每一个字符一个字节。UTF16可以是不同字符的不同字节数。@HansPassant,我如何知道是读取一个Int16还是两个Int16<代码>包含2个元素的代码点永远不会匹配“\n”-这正是我的问题-我如何测试换行符,而不知道我读取的是唯一的Int16,还是组成一个字符的两个元素中的第一个(或第二个)?