Encoding Windows文本编码问题

Encoding Windows文本编码问题,encoding,utf-8,Encoding,Utf 8,我正在尝试从音乐(m4a)文件中读取元数据。我已经成功地找到了如何在文件中导航以获取元数据。关于文件格式的文档很难获得,但我发现的是元数据的编码是UTF-8 这是我一直在解决的问题。我正在使用VisualBasic2008访问和读取文件中的数据。我使用BinaryStreamReader方法访问该文件。但是找不到处理元数据标记和元数据本身的编码设置。下面是我正在处理的数据样本的十六进制字符串 00 00 21 A9 6E 61 6D 00 00 00 19 64 61 74 61 00 00 0

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

这是我一直在解决的问题。我正在使用VisualBasic2008访问和读取文件中的数据。我使用BinaryStreamReader方法访问该文件。但是找不到处理元数据标记和元数据本身的编码设置。下面是我正在处理的数据样本的十六进制字符串

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

最后9个字节是一个名为Glósóli的音轨的名称,因此绝对是UTF-8。如果我将编码设置为UTF-8,我可以正确检索和显示该值。但是,如果我将编码更改为Windows-1252,则4个字符的元标记名A9 6E 61 6D将检索为“方形框”nam而不是©nam,我正确获取了©nam,但曲目名乱七八糟!! 你能解释一下为什么UTF-8编码不能正确识别0xA9字节吗? 我还注意到,在Notepad++中查看©nam和Glósóli的相同2个字符串会产生类似的结果。如果格式设置为UTF-8编码,则不显示©字符。如果Format设置为ANSII,则为,但曲目名称不正确。我找不到任何显示所需结果的设置。我相信答案是显而易见的,但我没有看到。 任何帮助或解释都将不胜感激

我正在运行Windows XP和所有最新的补丁程序


Mike

问题在于
A9
不编码UTF-8字符。Unicode码点与编码值不同<代码>U+00A9在UTF-8中编码为
C2 A9
。(UTF-8使用字节高位表示多字节字符,附加位表示字符中的后续字节数;这使得程序始终能够找到有效字符的开头,即使它被赋予指向多字节字符中间的指针,这也是UTF-8保持兼容性的一部分。)(对于不懂Unicode的旧程序,则为y。)

解码
.m4a
文件需要独立解码每个字段;您需要在标记名上使用ISO 8859/1编解码器,在标记值上使用适当的编解码器(用于字符串的编解码器通常是UTF-8,但并不总是UTF-8)

(顺便说一句,
U+00A9
编码到UTF-8,其第二个字节为
A9
,这一事实或多或少是偶然的;后者的前两位是UTF-8编码的一部分:
10
表示没有以下字符的多字节序列的一部分;更多细节。
C2
中的
2
实际上代表发送原始文件的顶部
A0


顺便说一句,是针对
System.Text.UTF8Encoding
的.NET文档;通过遵循类层次结构图,您可以访问其他.NET编解码器。

A9本身,或者在本例中,由低字节(即范围00-7F)包围的A9不能成为UTF-8序列的一部分。例如,请看一看,您将看到所有高字节(80-FF)作为多字节UTF-8序列的一部分出现

因此,您文件中的一些数据是其他非UTF-8内容-可能是元数据