For a single file, the only option(*) that I could make to work was this:
id3v2 -a "$(mp3info -p "%a" foo.mp3|iconv -f windows-1256 -t utf-8)"\
-A "$(mp3info -p "%l" foo.mp3|iconv -f windows-1256 -t utf-8)"\
-t "$(mp3info -p "%t" foo.mp3|iconv -f windows-1256 -t utf-8)" foo.mp3
for a single file called
foo.mp3. It resulted in ID3v1 (or 1.1) tags in windows-1256 being converted v2.3 tags in utf-8. The following caveats apply:
- If your tags are not Windows-1256 (for example, they're instead ISO-8859-6 or not arabic at all), the command will irrecoverably mangle them, without warning
- I only tested it with one file, that had no album info, so might not work for all cases
- It may or may not convert other tags, such as track number, year, genre, etc.
- I don't have Windows, so no clue whether the resulting files work there
If it works, put the command in a file, call it "retag.sh", replace foo.mp3 with "$1" (including the quotes). Then make a copy of all relevant mp3s
cp -a Music/mp3 Music/retagged-mp3 and replace with abandon:
find Music/retagged-mp3 -type f -print0|xargs -0 retag.sh. Once verified that they show ok and play ok and none were lost in conversion, replace the original mp3s with retagged ones.
(*) I tried lltag and id3v2 for reading the tags on command line, but that didn't work. puddletag, exfalso and easytag wouldn't show the tags at all, and tagtool would show them assuming ISO-8859-1 encoding.