Что происходит с нулевым байтом при преобразовании байтов в кодировку ISO 8859-1? - PullRequest
4 голосов
/ 11 июля 2011

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

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

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

Когда вы пытаетесь отобразить эти строки, они отображаются неправильно.

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

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

  • Редактировать: я использовал System.Text.Encoding.GetEncoding ("iso-8859-1")с последующим вызовом GetString

Ответы [ 2 ]

5 голосов
/ 11 июля 2011

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

Эта обработка 0 как Unicode 0 соответствует описанию Википедии :

В 1992 году IANA зарегистрировала карту символов ISO_8859-1: 1987, более известную под своим предпочтительным именем MIME ISO-8859-1 (обратите внимание на дополнительный дефис по сравнению с ISO 8859-1), расширенный набор ISO 8859- 1, для использования в Интернете. Эта карта присваивает C0 и C1 управляющие символы неназначенным кодовым значениям, таким образом, обеспечивается 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
    }
}
0 голосов
/ 11 июля 2011

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

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

...