Remember I complained about the Unicode tags in some of my MP3 files would be borked really badly on Android? Well, I solved it. Kind of.

For a while I’ve been trying to figure out what could be causing it. Some of my files were fine, some weren’t. Even innocent stuff like umlaut characters in German could break, while Japanese music would be displayed correctly.

I figured it must be something about the files themselves, since a character could display properly in one file and not in another. The UTF-16 setting of ID3v2.3 tags didn’t help. Android apparently can’t read ID3v2.4 tags (that are UTF-8).

I got fed up with my last.fm scrobbles getting messed up with the broken tags, so Saturday I sat down and experimented with EasyTAG until I got it working.

The trick was to use UTF-8 in ID3v2.3 tags. I’m not sure how much that adheres to the specification, but it definitely worked. I made EasyTAG run over my whole library, so hopefully I won’t run into the same problem again.

It’s pretty annoying though, because I have no way to notice there are encoding differences. Desktop players (foobar2000 on Windows and Clementine on Ubuntu) displayed the tags correctly, they just showed up wrong on Android. I’m not sure if it’s Android not being smart enough or the desktop players being flexible with the specification. Then again, if desktop players can do it, I’d really appreciate it if my phone could too.

Edit: Actually this method didn’t work either. Partially. It let files show up on the phone correctly, but it broke them for everything else. So… Some more experimenting to do.

Edit: After some very angry googling, I happened upon a GitHub issue discussing this problem. One of the comments mentioned forcing UTF-16, so I tested by trying both UTF-8 and UTF-16 in both ID3v2.3 and 2.4 until I found a combination that worked both on my phone and in Clementine. It’s such a drag… But at least it seems to work now. For now.