Печать Unicode от интерпретатора Scala - PullRequest
20 голосов
/ 22 декабря 2009

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

print(8364.toChar)

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

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

Ответы [ 3 ]

17 голосов
/ 30 декабря 2009

Я нашел причину проблемы и решение, чтобы она работала как надо. Как я уже подозревал после публикации моего вопроса и прочтения ответа 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, можно предоставить свойства 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).

3 голосов
/ 23 декабря 2009

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

Кодовая точка евро - 0x20AC (или в десятичном 8364), и это, кажется, работает для меня (я на Linux, в ночной 2.8):

scala> print(0x20AC.toChar)
€

Еще один забавный тест - напечатать символ снеговика Unicode:

scala> print(0x2603.toChar)
☃

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

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

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

scala> 402.toChar
res9: Char = ƒ
0 голосов
/ 20 июля 2016

Для Windows в командной строке (cmd) print:

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

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

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

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

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

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

...