Вопрос о кодировке текста в Windows - PullRequest
0 голосов
/ 17 июня 2011

Я пытаюсь прочитать метаданные из музыкального файла (m4a). Я успешно выяснил, как перемещаться по файлу, чтобы добраться до метаданных. Трудно найти документацию по формату файла, но я обнаружил, что кодировка метаданных - UTF-8.

Вот моя проблема, с которой я вырывал свои волосы. Я использую Visual Basic 2008 для доступа и чтения данных из файла. Я получаю доступ к файлу, используя методы BinaryStreamReader. Но не могу найти настройки кодирования, которая будет обрабатывать метаданные тегов И сами метаданные. Ниже приведена шестнадцатеричная строка образца данных, с которыми я работаю.

00 00 00 21 A9 6E 61 6D 00 00 00 19 64 61 74 61 00 00 00 01 00 00 00 47 6C C3 B3 73 C3 B3 6C 69

Последние 9 байтов являются названием трека под названием Glósóli - так что определенно UTF-8. Если я установлю кодировку на UTF-8, я могу получить и отобразить это значение правильно. Однако 4-символьное имя мета-тега A9 6E 61 6D извлекается как «квадратная ячейка» nam вместо © nam. Если я изменяю кодировку на Windows-1252, я получаю © nam правильно, но название трека - бред! Не могли бы вы объяснить, почему кодировка UTF-8 неправильно распознает байт 0xA9? Я также заметил, что просмотр одинаковых двухсимвольных строк для © nam и Glósóli в Notepad ++ дает аналогичные результаты. Если для параметра Формат задано значение Кодировать в UTF-8, символ © не отображается. Если для параметра Формат задано значение ANSII, это так, но название дорожки неверно. Я не могу найти настройки, которые отображают желаемый результат. Я уверен, что ответ очевиден, но я его не вижу. Буду признателен за любую помощь или объяснение

Я использую Windows XP со всеми последними патчами

Mike

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

Проблема в том, что A9 не кодирует символ UTF-8.Unicode кодовые точки не совпадают с закодированными значениями;U+00A9 кодируется в UTF-8 как C2 A9.(UTF-8 использует старший бит байтов для обозначения многобайтовых символов, с дополнительными битами, указывающими количество следующих байтов в символе; это позволяет программе всегда иметь возможность найти начало действительного символа, даже если ей дан указательв середину многобайтового символа, который является частью того, как UTF-8 сохраняет совместимость со старыми программами, которые не понимают Unicode.)

Для декодирования файла .m4a потребуется декодировать каждое поле независимо;вам нужно будет использовать кодек ISO 8859/1 для имен тегов и соответствующий кодек (который для строк часто, но не всегда будет UTF-8) для значений тегов.

(Кстати, фактчто U+00A9 кодирует в UTF-8 со вторым байтом, так как A9 более или менее случайен, первые два бита последнего являются частью кодировки UTF-8: 10 означает часть многобайтовой последовательности безследующие символы; подробности связаны здесь . 2 в C2 фактически представляет вершину оригинала A0.)

Кстати, здесь документация .NET для System.Text.UTF8Encoding;следуя диаграмме иерархии классов, вы можете получить доступ к другим кодекам .NET.

0 голосов
/ 17 июня 2011

A9 сам по себе - или как в этом случае окруженный младшими байтами (то есть в диапазоне 00-7F) не может быть частью последовательности UTF-8.Взгляните, например, на запись в википедии , и вы увидите, что все старшие байты (80-FF) встречаются как часть многобайтовой последовательности UTF-8.

Итак, некоторые данные в вашем файле - это другие файлы, отличные от UTF-8, возможно, метаданные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...