Windows文本编码问题

时间:2011-06-17 17:42:37

标签: encoding utf-8

我正在尝试从音乐(m4a)文件中读取元数据。我已成功找到如何浏览文件以获取元数据。关于文件格式的文档很难得到,但我发现有人声称元数据的编码是UTF-8。

这是我的问题,我一直在拉我的头发。我正在使用Visual Basic 2008来访问和读取文件中的数据。我使用BinaryStreamReader方法访问该文件。但是找不到能够处理元数据标签和元数据本身的编码设置。以下是我正在使用的数据样本的十六进制字符串。

<00> 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字节? 我还注意到在Notepad ++中查看©nam和Glósóli的相同2个字符串会产生类似的结果。如果格式设置为UTF-8编码,则不显示©字符。如果Format设置为ANSII,则轨道名称不正确。我找不到任何显示所需结果的设置。我确定答案很明显,但我没有看到。 任何帮助或解释将不胜感激

我正在运行带有所有最新补丁的Windows XP

麦克

2 个答案:

答案 0 :(得分:2)

问题是A9不编码UTF-8字符。 Unicode 代码点与编码值不同; U+00A9以UTF-8编码为C2 A9。 (UTF-8使用高位字节来指示多字节字符,其他位指示字符中后续字节的数量;这允许程序始终能够找到有效字符的开头,即使它被赋予了指针进入多字节字符的中间,这是UTF-8如何保持与不懂Unicode的旧程序的兼容性的一部分。)

解码.m4a文件需要独立解码每个字段;您需要在标签名称和相应的编解码器(对于字符串通常但不总是UTF-8)上使用ISO 8859/1编解码器作为标签值。

(顺便说一下,U+00A9编码为UTF-8,其第二个字节为A9的事实或多或少是偶然的;后者的前两位是UTF的一部分 - 8编码:10表示多字节序列的一部分,没有后续字符;更多详细信息linked here2中的C2实际上代表原始A0的顶部}。)

BTW,hereSystem.Text.UTF8Encoding的.NET文档;通过遵循类层次结构图,您可以访问其他.NET编解码器。

答案 1 :(得分:0)

A9本身 - 或者在这种情况下被低字节包围(即在00-7F范围内)不能是UTF-8序列的一部分。例如,查看the wikipedia entry,您将看到所有高字节(80-FF)都是多字节UTF-8序列的一部分。

所以 - 你文件中的一些数据是其他非UTF-8的东西 - 可能是元数据。