unicode - ID3v2.3 标签中的文本编码

标签 unicode encoding hex ascii id3

感谢这个站点和其他一些站点,我创建了一些简单的代码来从 MP3 文件中读取 ID3v2.3 标签。这样做是一次很棒的学习经历,因为我以前不了解十六进制/字节/二进制等。

我可以成功读取数据,但遇到了一个我认为与使用的编码有关的问题。我已经意识到文本帧在“文本”的开头有一个字节,用于描述所使用的编码,并且可能在接下来的 2 个字节中包含更多信息......

例子:
来自帧 TIT2 的数据从实际文本之前的字节 $03(十六进制)开始。此文本使用 Encoding.ASCII.GetString 正确显示,尽管在开头有一个附加字符

在另一个 MP3 中,来自 TIT2 的数据从 $01 开始,然后是 $FF $FE,我认为这与 Unicode 有关?但是文本本身被分解了,每个文本字符之间都有 $00,这会阻止数据在 Windows 窗体中显示(一旦遇到 00,文本就会停止,所以我得到第一个字符,就是这样)。我试过使用 Encoding.UNICODE.GetString,但这似乎只是胡言乱语。

将此数据打印到控制台似乎可以工作,每个字符之间都有空格,因此数据的读取工作正常。

我一直在阅读 ID3v2.3 的官方文档,但我想我只是不够了解文本编码部分。

任何可能有帮助的文章的回复或链接将不胜感激!

问候
罗斯

最佳答案

Data from frame TIT2 starts with the byte $03 (hex) before the actual text. This text displays correctly, albeit with an additional character at the beginning, using Encoding.ASCII.GetString



编码 0x03 是 UTF-8,所以你应该使用 Encoding.UTF8.GetString .开头的字符可能是U+FEFF Byte Order Mark,用来区分UTF-16LE和UTF-16BE……对UTF-8没用,但是Windows工具还是喜欢把它放在那里。

UTF-8 是 2.3 中不存在的 ID3v2.4 功能,这可能是您在规范中找不到它的原因。在现实世界中,无论版本如何,您都会在 ID3 标签中发现各种各样的废话。

data from TIT2 starts $01 and is followed by $FF $FE, which I believe is to do with Unicode? The text itself is broken up though, there are $00 between every text character,



这就是 UTF-16LE,Windows 误导性地将其称为“Unicode”的文本到字节编码。它由两个字节的代码单元组成,因此 U+0000–U+00FF 范围内的字符作为相同数字的低字节出现,然后是零高字节。 0xFF-0xFE 前缀是正确使用的字节顺序标记。 Encoding.Unicode.GetString应该从中返回正确的字符串 - 发布一些代码?

Printing this data to a console seems to work



在 Windows 控制台上打印非 ASCII 字符可能是一种尝试,因此如果您遇到问题,请记住它们可能是由打印操作本身引起的。

为了完整起见,编码 0x02 是没有 BOM 的 UTF-16BE(这种情况几乎没有存在的理由,而且我从未在野外遇到过这种情况),编码 0x00 应该是 ISO-8859-1,但实际上几乎可以是任何 ASCII 超集编码,更可能是 Windows 'ANSI' 代码页,如 Encoding.GetEncoding(1252)而不是像 8859-1 这样的标准。

关于unicode - ID3v2.3 标签中的文本编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9857727/

相关文章:

c - 在 linux 中,hyphen 是一个多字符字符?

mysql - CakePHP 将值作为 HTML 编码值保存到 MySQL 数据库

mysql - 使用 SQLDeveloper 查询 mysql 数据库不返回正确的值

mysql - SQL 字符串文字十六进制键到二进制和返回

wpf - 如何在 XAML 中放入 unicode 字符?

java - 添加 unicode\u0022 时编译时错误

JavaScript htmlentities 法语

java - 如何编写以\t 作为分隔符的 csv 文件?直接的方法行不通

linux - 需要一个好的 Linux 十六进制编辑器

javascript 将十六进制值的字符串表示形式转换为十六进制