2010-12-03 3 views
2

Я пытаюсь прочитать строку с нулевым завершением из массива байтов; параметром функции является кодировка.Являются ли нулевые термиторы частью кодирования текста?

string ReadString(Encoding encoding) 

Например, «Foo» в следующих кодировках являются:

UTF-32: 66 00 00 00 6f 00 00 00 6f 00 00 00 
UTF-8: 66 6f 6f 
UTF-7: 66 6f 6f 2b 41 41 41 2d 

Если я скопировал все байты в массив (чтение до нулевого терминатора) и передал этот массив в encoding.GetString(), это не сработало бы, потому что если бы строка была кодирована UTF-32, мой алгоритм достиг бы «нулевого терминатора» после второго байта.

Итак, у меня есть двойной вопрос: есть ли нулевые терминаторы в кодировке? Если нет, как я могу декодировать строковый символ по символу и проверить следующий байт для нулевого терминатора?

Заранее спасибо

(предложения также ценятся)

Edit:

Если "Foo" был нулем и UTF-32 в кодировке, которая бы это ?:

1. 66 00 00 00 6f 00 00 00 6f 00 00 00 00 
2. 66 00 00 00 6f 00 00 00 6f 00 00 00 00 00 00 00 
+0

для вашего редактирования будет «2. 66 00 00 00 6 00 00 00 6f 00 00 00 00 00 00 00», поскольку utf 32 рассматривает каждый символ (даже \ 0) как 4-байтовый массив – bigworld12 2017-03-22 18:50:47

+0

вот быстрый тест с использованием C# interactive: http://i.imgur.com/yvYiTD8.png – bigworld12 2017-03-22 19:03:51

ответ

1

Нулевой терминатор не является «логически» частью строки; это не считается полезной нагрузкой. Он широко используется в C/C++, чтобы указать, где заканчивается строка.

Сказав, что вы можете иметь строки со встроенными \ 0, но тогда вы должны быть осторожны, чтобы строка не казалась усеченной. Например, std :: string не имеет проблемы со встроенными \ 0. Но если вы делаете c_str() и не учитываете указанную длину(), ваша строка будет отключена.

1

Null terminators не являются частью кодировки, но строковое представление, используемое некоторым языком программирования, например C. В .NET System.String имеет префикс strin g как 32-битное целое число и не заканчивается нулем. Внутренне System.String всегда UTF-16, но вы можете использовать кодировку для вывода различных представлений.

Для второй части ... Используйте классы в System.Text, такие как UTF8Encoding и UTF32Encoding, чтобы прочитать строку. Вы просто должны выбрать правильный на основе вашего параметра ...

1

Это, кажется, работает хорошо для меня (выборка из фактического кода, который считывает юникода, оканчивающихся нулем строку из массива байтов):

//trim null-termination from end of string 
byte[] languageId = ... 
string language = Encoding.Unicode.GetString(languageId, 
               0, 
               languageId.Length).Trim('\0'); 
Смежные вопросы