Спецификация - это пространство нулевой ширины, поэтому в принципе невидимое.
Однако Window не имеет кодировки UTF-8, но использует одну из многих однобайтовых кодировок. Преобразование из String в вывод превратит спецификацию, отсутствующую в кодировке, в знак вопроса.
Still Notepad распознает спецификацию и отобразит текст UTF-8.
В настоящее время Linux обычно использует UTF-8, поэтому не имеет проблем и с консолью.
Дальнейшее объяснение
В Windows System.out
использует консоль, и эта консоль, например, использует в качестве кодировки / кодировки, например, Cp-850, однобайтовую кодировку из примерно 256 символов. Пропущенный вполне может быть ĉ
или символ спецификации. Если строка java содержит эти символы, они не могут быть закодированы в один из 256 доступных символов. Следовательно, они будут преобразованы в ?
.
Использование CharsetEncoder :
String s = ...
CharsetEncoder encoder = Charset.defaultCharset().newEncoder();
if (!encoder.canEncode(s)) {
System.out.println("A problem");
}
Windows обычно также работает с однобайтовой кодировкой, например Cp-1252. Опять 256 символов. Однако редакторы могут иметь дело с несколькими кодировками, и если шрифт может представлять символ (кодовая точка Unicode), то все работает.