Everyone knows, that audio devices are listed in Java with AudioSystem.getMixerInfo(). Mac users know, that the only sound device they have for Macintosh is Built-in Input, Built-In output and Java Sound Audio Engine, version 1.0. And only the ones who use non-latin symbols in OS, know about the problem with this function: Cyrillic letters looks like a habracadabra with it. I’m not sure about Japanese ones, has to be checked still..
Like this:
It happens because getMixerInfo() returns device data in Windows-1252 charset, but tries to output it in Windows-1251. We have to help it somehow
It might be cool to write a wrapper for javax.sound.sampled.Mixer.Info, but toString() and getName() methods in this class are final. Let’s use helper functions:
public class Shared {
private static String OS = null;
public static String getOsName()
{
if(OS == null)
OS = System.getProperty("os.name");
return OS;
}
public static boolean isWindows()
{
return getOsName().startsWith("Windows");
}
public static String toLocalString(Object info)
{
if(!isWindows())
return info.toString();
String defaultEncoding = Charset.defaultCharset().toString();
try
{
return new String(info.toString().getBytes("windows-1252"), defaultEncoding);
}
catch(UnsupportedEncodingException ex)
{
return info.toString();
}
}
}
Then we use Shared.toLocalString(item.getName()) for every such an instance. All of the titles are ok now:

