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

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

print(8364.toChar)

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

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

20
задан Martin Sturm 23 December 2009 в 14:16
поделиться

2 ответа

я нашел причину проблемы и решение, чтобы она работала так, как должна. Как я уже подозревал после размещения моего вопроса и прочтения ответа 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. В поисках ответа, если это учитывается, я наткнулся на discussion в списке рассылки 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).

.
17
ответ дан 30 November 2019 в 01:10
поделиться

Хорошо, по крайней мере, часть, если не все, вашей проблемой здесь является то, что 128 не является кодовым индексом Юникода для Евро. 128 (или 0x80, так как гекс, кажется, является нормой) это U+0080 , т.е. это не печатаемый символ, так что неудивительно, что ваш терминал испытывает трудности с его печатью.

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

scala> print(0x20AC.toChar)
€

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

scala> print(0x2603.toChar)
☃

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

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

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

scala> 402.toChar
res9: Char = ƒ
3
ответ дан 30 November 2019 в 01:10
поделиться
Другие вопросы по тегам:

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