Неверная печать значений Unicode [дубликат]

Существует библиотека (так называемый «клон») , что делает это довольно хорошо. Он обеспечивает наиболее полное рекурсивное клонирование / копирование произвольных объектов, о которых я знаю. Он также поддерживает циклические ссылки, которые еще не покрыты другими ответами.

Вы можете найти его на npm . Его можно использовать как для браузера, так и для Node.js.

Вот пример того, как его использовать:

Установите его с помощью

npm install clone

или упакуйте его с помощью Ender .

ender build clone [...]

Вы также можете загрузить исходный код вручную.

Затем вы можете использовать его в своем исходном коде.

var clone = require('clone');

var a = { foo: { bar: 'baz' } };  // inital value of a
var b = clone(a);                 // clone a -> b
a.foo.bar = 'foo';                // change a

console.log(a);                   // { foo: { bar: 'foo' } }
console.log(b);                   // { foo: { bar: 'baz' } }

(Отказ от ответственности: я являюсь автором библиотеки.)

1
задан KK99 27 February 2015 в 10:04
поделиться

3 ответа

Результат, который вы видите, указывает на то, что ваша консоль ожидает, что текст будет в кодировке Windows «code page 850» - символ ü имеет код UIC + UFC в кодировке Unicode. Значение байта 0xFC отображает в кодовой странице Windows 850 как ³. Поэтому, если вы хотите, чтобы имя отображалось правильно на консоли, вам нужно распечатать его, используя кодировку «Cp850»:

PrintWriter consoleOut = new PrintWriter(new OutputStreamWriter(System.out, "Cp850"));
consoleOut.println(filename);

. Это то, что ожидает ваше «другое приложение», это другой вопрос - другое приложение будет видеть только правильное имя, если оно читает свой стандартный ввод как Cp850 тоже.

3
ответ дан Ian Roberts 21 August 2018 в 14:42
поделиться
  • 1
    Я не уверен, правильно ли я вас понял. Другое приложение (BPEL-процесс), которое мы имеем, вызывает Java JAR и ожидает ответа (stdout). Сервер (windows), на котором находятся эти 2 приложения, имеет кодовую страницу 850. Я действительно не уверен, что еще мне нужно сделать, чтобы установить кодовую страницу. Также PrintWriter записывает в файл, а не в консоль – KK99 18 February 2015 в 12:41
  • 2
    @KarthikKrishnan, если вы передаете результат этой Java-программы в другой процесс (механизм BPEL), тогда вы можете игнорировать то, что он выглядит на консоли, когда вы запускаете автономный. Важно то, что кодировка, которую вы используете для записи вещей в stdout в процессе Java, такая же, как и кодировка, которую использует движок BPEL для ее чтения. Если это то, что вы можете настроить на стороне BPEL, настройте обе стороны использовать UTF-8 для максимальной совместимости. Если это не так, вам нужно выяснить, какую кодировку BPEL ожидает, а затем сделать вашу программу Java той же. – Ian Roberts 18 February 2015 в 16:36
  • 3
    Я полагаю, что это имеет ту же проблему, что и ответ проксислингтона. Вероятно, он будет работать некоторое время. Вы обмениваете одну кодировку на другую кодировку. После кодирования на Cp850 байты должны быть переданы прямо в FileDescriptor.out. – nicktalbot 11 May 2018 в 09:56
2
ответ дан Pepijn Schmitz 21 August 2018 в 14:42
поделиться

Попробуйте использовать:

 PrintStream out = new PrintStream(System.out, true, "UTF-8");
out.println(test);
1
ответ дан proxysingleton 21 August 2018 в 14:42
поделиться
  • 1
    Это не сработает – Jean-François Savard 17 February 2015 в 18:24
  • 2
    я получаю Textk├╝rzung_.asc – KK99 17 February 2015 в 18:25
  • 3
    @KarthikKrishnan Это записывает UTF-8 на консоль. Однако терминал понимает только некоторые изменения ANSI (вероятно, CP 437 ) и not UTF-8. Перенесите вывод в файл, затем откройте файл в редакторе, поддерживающем UTF-8, и «правильный текст». должен отображаться. – user2864740 17 February 2015 в 18:28
  • 4
    @KarthikKrishnan запись верна; чтение (или просмотр) - нет. Используйте java theprogram > thefile.txt, а затем откройте «thefile.txt». в wordpad.exe (not notepad!) для проверки. – user2864740 17 February 2015 в 18:30
  • 5
    @KarthikKrishnan «Другое приложение» необходимо правильно его прочитать (как UTF-8), а затем правильно отобразить его (с правильным шрифтом, так как Unicode правильно декодируется из UTF-8). Пример выше с перенаправлением файла показывает, что Java делает это правильно - "другое приложение" не читает байтовый поток правильно в UTF-8 (или не отображает его правильно как Unicode, например, если «другое приложение» записывает непосредственно на консоль). Как указано ранее, command.com/cmd.exe - это not UTF / Unicode-aware. При таком подходе данные в потоке stdout являются UTF-8, как и требовалось. – user2864740 18 February 2015 в 16:54
Другие вопросы по тегам:

Похожие вопросы: