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'мир'
строчки, всё остальное работает, как есть.