Печать Unicode из интерпретатора Scala

при использовании интерпретатора scala (т. е. выполнение команды "scala" в командной строке) я не могу правильно печатать символы юникода. Конечно, a-z, A-Z и т. д. печатаются правильно, но, например, € или ƒ печатается как a ?.

print(8364.toChar)

результаты ? вместо того.€ Возможно, я делаю что-то не так. Мой терминал поддерживает символы utf-8 и даже когда я передаю вывод в отдельный файл и открываю его в texteditor, ? отображаемый.

Это все происходит на Mac OS X (Snow Leopard, 10.6.2) с Scala 2.8 (ночная сборка) и Java 1.6.0_17)

3 ответов


я нашел причину проблемы и решение, чтобы заставить ее работать так, как она должна. Как я уже подозревал после публикации моего вопроса и чтения ответа Calum и проблем с кодировкой на Mac с другим проектом (который был на Java), причиной проблемы является кодировка по умолчанию, используемая Mac OS X. При запуске scala переводчик, он будет использовать кодировку по умолчанию для указанных платформ. В Mac OS X это Macroman, в Windows это, вероятно, CP1252. Вы можете проверить это введя следующую команду в интерпретаторе scala:

scala> System.getProperty("file.encoding");
res3: java.lang.String = MacRoman

по словам scala help test, можно предоставить свойства Java с помощью опции-D. Однако, это не работает для меня. В итоге я установил переменную окружения

JAVA_OPTS="-Dfile.encoding=UTF-8"

после scala результат предыдущей команды даст следующий результат:

scala> System.getProperty("file.encoding")
res0: java.lang.String = UTF-8

теперь, печать специальных символов работает ожидалось:

print(0x20AC.toChar)               
€

таким образом, это не ошибка в Scala, а проблема с кодировками по умолчанию. На мой взгляд, было бы лучше, если бы по умолчанию UTF-8 использовался на всех платформах. В моем поиске ответа, если это считается, я наткнулся на обсуждение в списке рассылки Scala по этому вопросу. В первом сообщении предлагается использовать UTF-8 по умолчанию на Mac OS X, когда file.encoding сообщает Macroman, так как UTF-8 является кодировкой по умолчанию в Mac OS X (заставляет меня задаваться вопросом, почему file.encoding по умолчанию установлено значение Macroman, возможно, это наследование от Mac OS до выпуска 10?). Я не думаю, что это предложение будет частью Scala 2.8, так как Мартин Одерский писал что, вероятно, лучше всего держать вещи, как они есть в Java (т. е. чтить file.encoding свойства).


хорошо, по крайней мере, часть, если не все, вашей проблемы здесь в том, что 128 не является кодовой точкой Unicode для евро. 128 (или 0x80, поскольку hex кажется нормой) - это U+0080 <control>, т. е. это не печатаемый символ, поэтому неудивительно, что у вашего терминала возникли проблемы с его печатью.

кодовая точка Euro-0x20AC (или в десятичном формате 8364), и это, похоже, работает для меня (я на Linux, каждую ночь 2.8):

scala> print(0x20AC.toChar)
€

еще один интересный тест-распечатать снеговика Unicode характер:

scala> print(0x2603.toChar)
☃

128 as €, по-видимому, является расширенным символом с одной из кодовых страниц Windows.

у меня есть другой персонаж, о котором вы упомянули, чтобы работать тоже:

scala> 'ƒ'.toInt
res8: Int = 402

scala> 402.toChar
res9: Char = ƒ

для Windows в командной строке (cmd) печать:

  1. set JAVA_OPTS="-Dfile.encoding=UTF-8"
  2. chcp 65001

пункт 2 означает UTF-8

Если вы не хотите каждый раз печатать "chcp 65001", вы можете изменить / добавить значение в реестре Windows следующим образом:

  1. выполнить команду regedit
  2. найти запись [HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
  3. New => строковое значение
  4. Name = "автозапуск", Data = " chcp 65001" (без кавычек)

(см. https://superuser.com/a/482117/454417)

Я использую Windows 10 и scala 2.11.8