这是一个基本的问题,但是我找不到任何关于它的东西,因为我不知道该搜索什么-我的每次尝试都提出了不相关的结果。
如果我使用Text.Encoding.ASCII.GetBytes
将字符串转换为ASCII,每个字节是否恰好代表一个字符?以下代码是否在所有情况下(除示例外的所有Strings
)都能准确地工作?
Dim t1() As Byte = Text.Encoding.ASCII.GetBytes("Hello ")
Dim t2() As Byte = Text.Encoding.ASCII.GetBytes("World")
Dim msg As String = Text.Encoding.ASCII.GetString(t1.Concat(t2).ToArray)
现在msg
应该是"Hello World"
。
我希望这能起作用,因为我不想把我收到的数据转换回Strings
,以便在再次发送之前操纵它。
如果我使用ASCII以外的东西(例如UTF-8)会怎么样?
如果我使用Text.Encoding.ASCII.GetBytes将字符串转换为ASCII,每个字节是否代表一个字符?
是的。ASCII是一个7位编码,它不支持多字节字符。任何高于U-007F的Unicode码点都将被转换为ASCII中的?
字符。
例如,如果您使用UTF-7,它可以将单个Unicode码点编码为多个ASCII字符的序列。
下面的代码在所有情况下(除了示例之外的所有字符串)都能准确地工作吗?
在您的特定示例中,是的(如果您使用LINQ的Concat()
方法-还有其他方法将数组连接在一起)。没有数据丢失。
但是对于其他示例,只要知道如果将非ASCII字符转换为ASCII,或者GetBytes()
和GetString()
之间的编码不匹配,则会导致数据丢失。
当然可以操作字节数组。只要确保数组在合并时使用相同的编码即可。
。. NET字符串是由UTF-16编码单元(char
)组成的计数序列,其中一个或两个编码Unicode码点(int
Char)。ConvertToUtf32)。一些代码点是"组合字符",当应用到前面的"基本字符"时形成字形(然后由字体呈现为字形)。
从Unicode到另一个字符集编码的编码器应该尝试保留字素。在。net中,字形被称为"文本元素"。
所以,是的,只要你没有通过将字素的部分转换成不同的字节序列而击败编码器,你就可以组合编码的字节序列。如果在编码之前将字符串分成两个,请参阅TextElementEnumerator和StringInfo类。