我正在尝试从音乐(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个字符的元标记名Windows6e 61 6D被检索为“square box”nam而不是©nam如果我将编码更改为A9 -1252,我得到了正确的©nam,但曲目名称是胡言乱语!!你能解释一下为什么UTF-8编码不能正确识别0xA9字节吗?我还注意到,在Notepad++中查看©nam和Glósóli的相同2个字符串会产生类似的结果。如果格式设置为以UTF-8编码,则不显示©字符。如果格式设置为ANSII,则是ANSII,但曲目名称不正确。我找不到任何显示所需结果的设置。我相信答案是显而易见的,但我看不出来。任何帮助或解释都将不胜感激。
我正在运行带有所有最新修补程序的Windows XP
麦克
发布于 2011-06-18 01:50:49
问题是A9不编码UTF-8字符。Unicode代码点与编码值不同;在UTF8中将U+00A9编码为C2 A9。(UTF-8使用字节的高位来表示多字节字符,附加的位表示字符中后面的字节数;这允许程序始终能够找到有效字符的开头,即使给它一个指向多字节字符中间的指针,这也是UTF-8保持与不理解Unicode的旧程序的兼容性的一部分。)
解码.m4a文件将需要单独解码每个字段;您将需要对标记名使用ISO8859/1编解码器,并对标记值使用适当的编解码器(对于字符串,通常为UTF-8,但不总是如此)。
(顺便说一句,U+00A9以其第二个字节作为A9编码为UTF-8或多或少是偶然的;后者的前两个比特是UTF-8编码的一部分:10表示没有后续字符的多字节序列的一部分;更多细节是linked here。C2中的2实际上表示原始A0的顶部。)
顺便说一句,here是用于System.Text.UTF8Encoding的.NET文档;通过遵循类层次结构图,您可以获得其他.NET编解码器。
发布于 2011-06-18 01:53:03
A9本身-或者在这种情况下被低位字节包围(即在00-7F范围内)不能是UTF8序列的一部分。以the wikipedia entry为例,您将看到所有高字节(80-FF)都是作为多字节UTF-8序列的一部分出现的。
所以-文件中的一些数据是其他非UTF-8的东西-可能是元数据。
https://stackoverflow.com/questions/6389625
复制相似问题