2011-07-11 5 views
4

Я не совсем уверен, что вопрос имеет смысл. Я преобразовываю массив байтов, взятый из тега ID3, и преобразовываю его в строку. Большинство текстовых фреймов в теге ID3 используют кодировку ISO 8859-1, но это зависит от фрейма. В любом случае, если вы посмотрите, что 0x00 находится в кодах ISO 8859-1, это неверно.Что происходит с нулевым байтом при преобразовании байтов в кодировку ISO 8859-1?

Чтобы еще больше усложнить ошибку, вызвав ошибку программиста или просто плохое форматирование, некоторые из строк заканчиваются на 0x00, а некоторые нет.

При преобразовании ряда байтов в строку с использованием кодировки ISO 8859-1 вы вручную проверяете конец строки, чтобы увидеть, является ли она нулевым? Или объект кодирования с помощью любого метода, который он использует для преобразования, в первую очередь, имеет дело с нулем? Кроме того, есть ли какая-то функция, которая могла бы нормализовать или «исправить» строку с нулевым завершением?

При попытке отобразить эти строки они не отображаются должным образом.

Я использую C# для этого конкретного проекта. Дополнительная информация здесь о ID3 Теги: ID3 Specs

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

  • Edit: я использовал System.Text.Encoding.GetEncoding ("ISO-8859-1"), а затем GetString вызова
+0

При преобразовании вы будете преобразования данных из одного представления в другое. Вы сказали, к чему вы клоните. Из чего вы переходите. Вы этого не сказали. –

ответ

0

Счастливо, ASCII, ISO-8859-1 и Unicode все согласны на кодовых точках в диапазоне 0,127. Таким образом, ваш персонаж '\0' будет кодироваться идентично в ASCII, ISO-8859-1 и UTF-8.

Если ваша программа назначает специальную семантику нулевому байту, вы должны позаботиться об этом соответствующим образом.

+0

Хорошо. Итак, да 0x00 преобразуется в '\ 0'. Но при преобразовании серии байтов (конец в 0x00) должен быть включен null? Или это приведет к тому, что строка будет иметь 2 нулевых терминатора? Например, добавит ли C# еще один нулевой ограничитель в конец строки? В любом случае, после отображения такой строки она закручивает отображение всех остальных строк. – user838293

+0

Это зависит полностью от того, работаете ли вы с функцией, которая интерпретирует строки байтов как символьные строки с нулевым символом или нет. Проверьте свою документацию. Я не знаю C#, но в C строковые функции останавливаются в нулевом байте, тогда как в C++ класс строки совершенно безразличен относительно значения байтов. –

5

Если вы используете Encoding.GetEncoding(28591), он просто преобразует байт 0 в Unicode U + 0000. Кодировки обычно предполагают, что они должны преобразовать все байты - они не ищут терминаторов.

Эта обработка, как Unicode 0 0 инлайн с Wikipedia description:

В 1992 году IANA, зарегистрировал карту символов ISO_8859-1: 1987, более известный своим предпочтительным именем MIME из ISO-8859 -1 (обратите внимание на дополнительный дефис по ISO 8859-1), надмножество ISO 8859-1, для использования в Интернете. Эта карта присваивает C0 and C1 control characters неназначенным значениям кода, таким образом, обеспечивает 256 символов через каждое возможное 8-битное значение.

страница управляющих символов C0 и C1 включает в себя:

0: Первоначально используемый, чтобы пробелы, которые необходимо оставить на бумажной ленте для редактирования. Позже используется для заполнения после кода, который может занять некоторое время для обработки терминала (например, возврат каретки или линия на терминале печати). Теперь часто используется в качестве ограничителя строк, особенно на языке программирования C.

Пример кода:

using System; 
using System.Text; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     byte[] data = { 0, 0 }; 
     Encoding latin1 = Encoding.GetEncoding(28591); 

     string text = latin1.GetString(data); 
     Console.WriteLine(text.Length); // 2 
     Console.WriteLine((int) text[0]); // 0 
     Console.WriteLine((int) text[1]); // 0 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^