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: