pha*_*teh 6 unicode encoding hex ascii id3
感谢这个网站和其他一些网站,我创建了一些简单的代码来从MP3文件中读取ID3v2.3标签.这样做是一次很棒的学习经历,因为我之前不知道十六进制/字节/二进制等.
我可以成功读取数据,但遇到了一个我认为与使用的编码有关的问题.我已经意识到Text框架在'text'开头有一个字节描述了所使用的编码,并且可能在接下来的2个字节中有更多的信息......
示例:来自帧TIT2的数据以实际文本之前的字节$ 03(十六进制)开始.使用Encoding.ASCII.GetString,此文本正确显示,尽管在开头有一个额外的字符
在另一个MP3中,来自TIT2的数据启动$ 01,然后是$ FF $ FE,我相信这与Unicode有关吗?虽然文本本身被分解,每个文本字符之间有$ 00,这会阻止数据显示在windows窗体中(一旦遇到00,文本就会停止,所以我得到了第一个字符,那就是它).我已经尝试过使用Encoding.UNICODE.GetString,但这似乎只是回归乱码.
将这些数据打印到控制台似乎有效,每个字符之间有空格,因此数据的读取工作正常.
我一直在阅读ID3v2.3的官方文档,但我想我只是不太了解文本编码部分.
任何回复或链接到可能有帮助的文章将非常感谢!
关心罗斯
只需为文本编码代码添加一条注释:
00 - ISO-8859-1(ASCII).
01 - UCS-2(带BOM的UTF-16编码Unicode),ID3v2.2和ID3v2.3.
02 - 在ID3v2.4中UTF-16BE编码的无BOM的Unicode.
03 - UTF-8编码的Unicode,ID3v2.4.
来自:http: //en.wikipedia.org/wiki/ID3
\n\n\n帧 TIT2 中的数据以实际文本之前的字节 $03(十六进制)开始。该文本使用 Encoding.ASCII.GetString 正确显示,尽管开头有一个附加字符
\n
编码 0x03 是 UTF-8,因此您应该使用Encoding.UTF8.GetString. 开头的字符可能是U+FEFF Byte Order Mark,它是用来区分UTF-16LE和UTF-16BE的……对于UTF-8来说没什么用,但Windows工具无论如何都喜欢把它放在那里。
UTF-8 是 ID3v2.4 的一项功能,2.3 中不存在,这可能就是您在规范中找不到它的原因。在现实世界中,无论版本如何,您都会在 ID3 标签中发现各种完全无意义的内容。
\n\n\n\n\n来自 TIT2 的数据以 $01 开头,然后是 $FF $FE,我认为这与 Unicode 有关?文本本身被分解了,每个文本字符之间有 $00,
\n
这就是 UTF-16LE,即 Windows 误导性地称为 \xe2\x80\x9cUnicode\xe2\x80\x9d 的文本到字节编码。它由两字节代码单元组成,因此 U+0000\xe2\x80\x93U+00FF 范围内的字符作为同一数字的低字节出现,后面跟着一个零高字节。0xFF-0xFE 前缀是正确使用的字节顺序标记。Encoding.Unicode.GetString应该从 this\xe2\x80\x94post 一些代码返回正确的字符串?
\n\n\n将此数据打印到控制台似乎可行
\n
在 Windows 控制台上打印非 ASCII 字符可能是一个尝试,因此如果您遇到问题,请记住它们可能是由打印操作本身引起的。
\n\n为了完整起见,编码 0x02 是没有 BOM 的 UTF-16BE(没有什么理由存在这种情况,我从来没有在野外遇到过这种情况),编码 0x00 应该是 ISO-8859-1,但实际上几乎可以是任何 ASCII 超集编码,更可能是 Windows \xe2\x80\x98ANSI\xe2\x80\x99 代码页,而不是像Encoding.GetEncoding(1252)8859-1 这样的标准。