这是一个基本问题,但我找不到任何内容,因为我不知道要搜索什么 - 我的每一次尝试都得出了无关的结果。
如果我使用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)怎么办?
答案 0 :(得分:2)
如果我使用Text.Encoding.ASCII.GetBytes将字符串转换为ASCII,那么每个字节是否只代表一个字符?
是。 ASCII是7位编码,不支持多字节字符。 U-007F之上的任何Unicode代码点都将转换为ASCII中的?
字符。
例如,如果您使用UTF-7,它可以将单个Unicode代码点编码为多个ASCII字符序列。
以下代码是否在所有情况下都能正常工作(对于除示例之外的所有字符串)?
在您的特定示例中,是(如果您使用的是LINQ' s Concat()
method - 有other ways将数组连接在一起)。没有数据丢失。
但是对于其他示例,只要知道如果将非ASCII字符转换为ASCII,或者GetBytes()
和GetString()
之间的编码不匹配,就会丢失数据。
你当然可以操纵字节数组。如果将它们合并在一起,只需确保数组采用相同的编码。
答案 1 :(得分:1)
.NET字符串是UTF-16代码单元(char
)的计数序列,其中一个或两个编码Unicode代码点(int
Char.ConvertToUtf32)。一些代码点是"组合字符",当应用于前面的"基本字符"形成一个字形(然后由字体呈现为字形)。
从Unicode到另一个字符集的编码的编码器应该尝试保留字形。在.NET中,字形称为"文本元素。"
所以,是的,你可以组合编码的字节序列,只要你没有通过将字母的部分转换成不同的字节序列来打败编码器。如果在编码之前将字符串分成两个,请参阅TextElementEnumerator和StringInfo类。