Печать 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) печать:
set JAVA_OPTS="-Dfile.encoding=UTF-8"
chcp 65001
пункт 2 означает UTF-8
Если вы не хотите каждый раз печатать "chcp 65001", вы можете изменить / добавить значение в реестре Windows следующим образом:
- выполнить команду
regedit
- найти запись [HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
- New => строковое значение
- Name = "автозапуск", Data = " chcp 65001" (без кавычек)
(см. https://superuser.com/a/482117/454417)
Я использую Windows 10 и scala 2.11.8