RingoJS не печатает символы юникода

#javascript #windows #unicode #cygwin #ringojs

#javascript #Windows #юникод #cygwin #ringojs

Вопрос:

У меня возникли проблемы с получением Ringo.JS для печати символов юникода. Моей средой выполнения является cygwin. Я свел это к однострочной программе (см. Ниже), которая демонстрирует проблему. cat Указывает, что мой терминал способен отображать текст в юникоде, но ringo этого не делает. Мне интересно, выполняется ли каким-либо образом сценарий оболочки «ringo» способом, не соответствующим юникоду, но я не очень хорошо разбираюсь в способах exec редактирования оболочек. гораздо меньше нужно знать, почему некоторые методы могут иметь или не иметь поддержку юникода.

Есть ли способ заставить ringo корректно печатать юникод в cygwin?

 $ cat unicodeTest.js
print( "αλφα" );
console.log( "αλφα" );
$ ringo unicodeTest.js
αλφα
αλφα
$ ringo --version
RingoJS version 0.10
$ which ringo
/cygdrive/c/bin/ringojs-0.10/bin/ringo
  

Обновить:

Из любопытства я попытался перенаправить вывод в файл и проверить его. Определенно что-то не так с тем, как работает ringo в моем терминале, потому что терминал может печатать юникод, а ringo обрабатывает юникод правильно, но ringo не печатает юникод в терминале. Кто-нибудь знает, что может вызвать это?

 $ ringo unicodeTest.js  > output.text
αλφα

$ cat output.text
αλφα
  

ОБНОВЛЕНИЕ # 2:

Похоже, что ringo для Windows не поддерживает utf8 в консольном вводе-выводе. Однако, node.js работает. Я переключился на другую машину под управлением другой версии Windows и получил похожие результаты.

 $ cat utf8test.js
console.log( "καίρε, κόσμε" );
$ ringo utf8test.js
και��ε, κο�σμε
$ node utf8test.js
καίρε, κόσμε
  

Итак, если вы хотите написать программу на JavaScript для выполнения utf8 на консоли в Windows, то решение заключается в использовании node.js и не ringojs. The node.js разработчики добавили блокирующие версии ввода-вывода многих API (например, fs.ReadFile или fs.readFileSync), так что вы можете выбрать модель ввода-вывода, соответствующую вашим потребностям.

Комментарии:

1. В целом безопаснее использовать исходный код только в формате ASCII. Если вам нужны символы, отличные от ASCII, в строковых литералах или регулярных выражениях, экранируйте их , например 'u03B1u03BBu03C6u03B1' .

2. Ринго предполагает, что консоль поддерживает потоковый ввод-вывод в формате UTF-8, который распространен везде, кроме Windows. Заставить консоль Windows печатать Юникод из чего угодно, кроме приложения, работающего только с Win32-API, на удивление болезненно, и обычно этого лучше избегать.

3. @MathiasBynens Хотя вы технически правы, экранированные строки непонятны (я бы не знал, что это 'u03B1u03BBu03C6u03B1' такое αλφα без справочной таблицы). Непонятный код на самом деле не поддается сопровождению, поэтому экранирование строк на самом деле не масштабируется для приложения.

4. @LeeJenkins Вы могли бы использовать транспилятор, который использует библиотеку, подобную jsesc , для перевода строковых литералов в их экранированную форму как часть этапа сборки.