2009年12月9日星期三

文件编码害死人,聪明反被聪明误

最近给DoCoMo的手机编一个小程序。DoCoMo手机上的程序称为iAppli,是DoCoMo定制的Java程序。DoCoMo提供iAppli模拟器,可以在PC上调试此类程序。

我用VIM编辑程序代码,遇到奇怪的输出乱码问题。看了模拟器的设置,在程序中指定了字体,做了编码转换,做了种种努力,黔驴技穷,死活不知道问题在哪里。最后用上了愚公移山的办法,把各部分代码逐渐拷贝到一个正常运行的例子程序中去,一点一点试,直到例子程序完全与出问题的程序一样了,还是正常输出,我快要疯了。

在Cygwin下用file命令查看,才发现文件编码不同:

$ file serialtest1.java
serialtest.java: Non-ISO extended-ASCII Java program text, with CRLF line terminators

$ file serialtest2.java
serialtest2.java: UTF-8 Unicode Java program text, with CRLF line terminators

前者是从模拟器自带的例子程序直接修改的,后者则是重新建立的文件。iAppli模拟器竟然不支持UTF-8!

这个沉痛教训再一次证明,问题通常都很简单,KISS不仅适用于设计程序,也适用于调试程序。
[......]