2016-08-29 46 views
0

这是一个基本问题,但我找不到任何东西,因为我不知道要搜索什么 - 我的每个尝试都得出了无关的结果。可以将ASCII数组作为数组操作而不转换为字符串形式吗?

如果我使用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),那该怎么办?

回答

2

如果我使用Text.Encoding.ASCII.GetBytes将字符串转换为ASCII,每个字节是否只表示一个字符?

是的。 ASCII是7位编码,它不支持多字节字符。 U-007F上方的任何Unicode码点将转换为ASCII码中的?字符。

例如,如果您要使用UTF-7,则可以将单个Unicode代码点编码为多个ASCII字符序列。

以下代码是否适用于所有情况下的精确打算(适用于除示例以外的所有字符串)?

在你的具体的例子,是的(前提是你使用LINQ的Concat() method - 有other ways到Concat的阵列一起)。没有数据丢失。

但是对于其他示例,只要知道如果将非ASCII字符转换为ASCII或在GetBytes()GetString()之间以其他方式不匹配编码就会丢失数据。你可以操纵字节数组。如果将它们合并在一起,请确保数组使用相同的编码。

+1

如果您更喜欢通过替换字符进行无提示数据丢失的例外(默认值是?)编码ASCII不支持的字符时,可以[创建自己的编码器](https://msdn.microsoft.com/en-us/library/ms404377(v = vs.110).aspx#Exception)基于标准的ASCII编码器。 –

1

.NET字符串是UTF-16代码单元(char)的统计序列,其中一个或两个编码Unicode代码点(intChar.ConvertToUtf32)。有些代码点是“组合字符”,它们在应用于前面的“基本字符”时形成一个字形(然后通过字体将其呈现为字形)。

从Unicode到另一个字符集的编码的编码器应尝试保留字形。在.NET中,字形称为“文本元素”。

所以,是的,只要你还没有通过将字形部分转换成不同的字节序列,你就可以组合编码的字节序列。如果在编码之前将字符串拆分为两个字符,请参阅TextElementEnumerator和StringInfo类。