Roy Notes

技术 创业 思考

Print Unicode Characters to the OSX Terminal With Java

在OSX环境下,如果你没有使用Eclipse、NetBeans等IDE来编写Java代码,当使用sysout或Logger向控制台输出UTF8字符时是会出现乱码。

比如我们编写一个类来测试一下(OSX terminal和textmate均已经配置为UTF8编码) # export LANG=zh_CN.UTF-8
# touch T.java
# mate T.java

然后,我用textmate来编辑并录入以下内容 public class T
{ public static void main(String[] args) {
System.out.println("中文");
} }

我尝试在终端下编译并运行它

# javac T.java
T.java:4: ???棺???? EUC_CN ?IJ???ӳ???ַ?
System.out.println("???");
^ T.java:4: ???棺???? EUC_CN ?IJ???ӳ???ַ?
System.out.println("???");
^

明显是因为识别不到UTF8引起错误。其实我们编译时需要加入参数-encoding UTF8 可以解决这个问题 javac -encoding UTF8 T.java 但在同理在运行这个T.class我们也要加入输出的编码参数,以令Java不使用默认的输出编码(ISO8859) java -Dfile.encoding=utf8 T

至此,已经知道如何解决Java在OSX终端下显示utf8的问题了。但如果你在textmate中执行cmd+R(安装了Java.tmBundle),你会发现问题跟刚才讲的如出一撤,无法运行。其实这里有点小BUG,插件作者同样没有处理了javac的编译问题,你可以编译以下文件修复这个问题 # mate ~/Library/Application Support/TextMate/Bundles/Java.tmbundle/Support/bin/java_compile_and_run.sh 在第16行和第21行添加参数-encoding UTF8,如下: ......
"$TM_JAVAC" -encoding UTF8 -d "$output" $TM_JAVA_FILEGLOB; rc=$?;
.......
"$TM_JAVAC" -encoding UTF8 -d "$output" "$SOURCE"; rc=$?;
........

保存,再运行一次cmd+R看看,应该就正常了。(这里是我修复的派生版本:http://github.com/roymax/Java.tmbundle)

在PlayFramework中,通常会在命令行中play run 或play test,如果我们在终端同样有输出的话,也会乱码。
要修改这个问题,可以编辑在PLAY_ROOT/中的play(基于1.0)或PLAY_ROOT/framework/pym/play/下的application.py(基于1.1 beta2)文件,在文件中找java_cmd,在它前面加入一行 java_args.append ('-Dfile.encoding = utf8'); 基于Python代码的特性,请记住,这一行需要跟java_cmd是并列缩进的,如果你懂py,估计你知道我在说什么了
或者如果不想改动Play的原文件,那么你在启动时这样做了,一样可行 play run -Dfile.encoding=utf8 Notes: Play的作者说已经修复这个问题在仓库主干了,也许下一版本就不需要这么麻烦

Comments