2016-08-29 6 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-битное кодирование, оно не поддерживает многобайтовые символы. Любой код Unicode выше U-007F преобразуется в символ ? в 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). Некоторыми кодовыми точками являются «комбинирование символов», которые при применении к предыдущему «базовому символу» образуют графему (которая затем отображается шрифтом в глиф).

Кодировщик из Юникода для кодирования другого набора символов должен попытаться сохранить графемы. В .NET графема называется «текстовым элементом».

Итак, да, вы можете комбинировать кодированные последовательности байтов, пока вы не побеждали кодировщик, преобразовывая части графемы в разные последовательности байтов. Если вы нарушаете строку до двух перед кодировкой, см. TextElementEnumerator и класс StringInfo.