JavaScript charset в браузере

Согласно стандарту HTML5, стандартная кодировка страницы — UTF-8. А вот с JavaScript всё сложнее.

Пусть у нас есть какой-то JSON. Напишем функцию, которая его возвращает:

function getOutlineJson() {
  return {
      "title" : "Элемент1"
  };
}

Сохраняем в отдельный файл, привязываем через <script>. Пытаемся вывести в консоль:

document.addEventListener('DOMContentLoaded', function() {
  console.log(getOutlineJson());
});

В консоли будет JSON с полями на неведомом языке. Хотя, как подтверждает view.encoding() в консоли Sub­lime, все файлы — в UTF-8.

А если добавить вывод чего-то кириллического прямо на экран?

document.addEventListener('DOMContentLoaded', function() {
  console.log("проверка консоли");
  console.log(getOutlineJson());
});

Внезапно, кодировка починилась. Видимо, кодировка выставляется по первому вызову.

Лечится мета-тегом:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

Проверено в Fire­fox и Chrome.

Incorrect characters in the list of audio devices in Java

Every­one knows, that audio devices are list­ed in Java with AudioSystem.getMixerInfo(). Mac users know, that the only sound device they have for Mac­in­tosh is Built-in Input, Built-In out­put and Java Sound Audio Engine, ver­sion 1.0. And only the ones who use non-latin sym­bols in OS, know about the prob­lem with this func­tion: Cyril­lic let­ters looks like a habra­cadabra with it. I’m not sure about Japan­ese ones, has to be checked still..
Like this:
It hap­pens because get­Mix­erIn­fo() returns device data in Win­dows-1252 charset, but tries to out­put it in Win­dows-1251. We have to help it some­how
It might be cool to write a wrap­per for javax.sound.sampled.Mixer.Info, but toString() and get­Name() meth­ods in this class are final. Let’s use helper func­tions:
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: