Кирилица в PythonInterpreter

Рейтинг: 1Ответов: 1Опубликовано: 17.09.2014

Собственно проблема: не нашел возможности сменить кодировку в Jython (из джавы, не в консольке самого джитона), по умолчанию стоит ascii, и с кирилицей работать, само собой, не получается. Может, есть способы?
Если пробовать передавать кирилицу, хотя бы сделав что-то вроде interpreter.exec("print пфва"); , на выходе получаются знаки вопроса ????

Jython 2.5.3, пробовал 2.2 - то же самое.

Ответы

▲ 1

jython понимает стандартную декларацию для кодировки исходного кода:

#!/usr/bin/env jython
# -*- coding: utf-8 -*-
print u"Do You Want To Build A \N{Snowman}?" # ☃ - работает
print u"\u043c\u0438\u0440" # тоже работает, даже если coding: ascii
print u"мир" # требует coding: utf-8

Если декларацию не использовать, то всё равно первые две строки в примере продолжат работать, т.е. она нужна только чтобы использовать не ascii символы в самом исходном коде.

Если хочется писать русские буквы прямо в java коде, то при компиляции можно указать, какая кодировка использовалась, если система использует что-то другое по умолчанию:

$ javac -encoding UTF-8 JythonSourceEncodingTester.java

java тоже использует \uxxxx, поэтому необходимо использовать двойные слэши:

import org.python.util.PythonInterpreter;
import org.python.core.*;

public class JythonSourceEncodingTester {
    public static void main(String []args) throws PyException
    {
    PythonInterpreter interp = new PythonInterpreter() {
             {
                 cflags = new CompilerFlags(CompilerFlags.PyCF_SOURCE_IS_UTF8);
             }
         };
    System.out.println("Hello, brave new мир");
    // \u043c распознаётся джавой
    interp.set("unicode_string", "\u043c\u0438\u0440");
    interp.exec("print unicode_string, type(unicode_string)");
    interp.set("same", "мир"); // абсолютно тоже самое
    interp.exec("print same, type(same)");
    interp.exec("assert same == unicode_string");
    interp.exec("print u'\\N{Snowman}'"); // \\N{..} распознаётся jython
    interp.exec("print u'\\u043c\\u0438\\u0440'"); // \\u... распознаётся jython
    // печатает ???, если PyCF_SOURCE_IS_UTF8 не используется
    interp.exec("print u'мир'");
    System.out.println("Goodbye, cruel мир");
    }
}

PyCF_SOURCE_IS_UTF8 нужен только для print u'мир' строчки, всё остальное работает, как есть.