Mac Eclipse里面编码转换正常,打成Jar包以后转码成乱码问题
问题出现的背景:
我之前都是用 Windows 操作系统的,我在 windows里面搞Java 用的是 Eclipse,
由于无知浅陋,我在 eclipse 里面的项目多是以 GBK 编码的。
因为 windows 是支持 GBK 中文编码的,而且 windows 下面的 eclipse 也支持项目用 GBK 编码。
所以,我上面所采用的做法在 windows 上面是不存在什么问题的。
有一天,我开始使用 Mac 做 ios开发了,这时候我开始学习 objective-c ,因为做苹果开发必须要用到这门语言。
我是写 Java 走进程序编写的大门的,而且弄 Java 弄的再短也比 Objective-c 长了不知道多少时间了。。
理所当然,我用 java 做起事情来还是比 objective-c 利索地多很多了。
因此,我也经常转到 mac 的eclipse 里面来写一些东西,一些辅助 ios 开发的 java 工具~
不得不承认,这是一个很不错的选择,因为我若要用 XCode 以 objective-c来写GUI或者命令行工具的话
无疑我得在熟悉 objective-c 的基础 API 上面花费不少的时间。
基于上,我选择,我Java~
既然我做出了决定,那么首要事情便是将我在 windows 上面写的所有 Java 工程弄到 mac 的eclipse 里面来~
工程弄到mac 里面是简单,copy一下就搞定了。
但是,我这个人有个不好的习惯,那就是非常热衷于写注释,我弄了不少的Java 工程,
自己写了不少,别人有用的工程我也研究了不少,总的来说,我写了很多注释。。
悲剧诞生了,我写的注释多是在 GBK编码的项目中写的。
蛋疼的是 Mac 里面的 eclipse 并不支持 GBK 编码。
因此,以往我辛辛苦苦写的注释都成了火星文,这让我感到十分的沮丧~
解决方案自然是有,不过有好有坏,看你怎么选了。
一般情况下,有两种选择:
第一种就是很机械化的去转码,在windwos 平台下面用 EditPlus 的转码功能可以办到,
在windows里面转换完毕了之后再 copy 到mac 里面即可!虽然很笨3,但也不失为一种解决方案~
第二种算不上很聪明,或许花费的时间比第一种所花费的时间还多,但是能拯救自己,也能拯救别人,
一键式操作,或者是一个拖拽,然后,大功告成~
我所说的第二种方案便是自己来写一个工具,用这个工具来进行 .java 文件的编码转换。
而且,一转便能将整个工程甚至整个 workspace 下面的所有工程给转好~
首先,我自问我是一名程序员,岂能容忍我自己去干一些重复性操作的体力劳动,
就如同小时候读过的一篇文章:我是一个人,人怎么能从狗洞子里面爬出?
我只是抒发一下自己的愤慨,其实也是为了能锻炼或者复习一下自己操作 Java 的能力,
我选择了后者,我花了 2 天时间(坛子,eclipse,blog,测试,走神,etc。时间过的真的很快~)
其间我复习或者学习了下面的东西 :
0。用 Java 压缩目录,java 使用 mac (unix)命令行压缩目录
1。用 Java 复制文件目录,java 使用 mac(unix) 命令行压缩目录(复制文件很简单,但是复制目录却是有点儿小麻烦)~
2。怎么打Jar 包,manifest写法,jardesc 文件用法,JavaDecompiler,FatJar...
3。怎么使 Ant。project,target,copy,property,jar,java,javac,echo..等等标签以及相关属性的用法~
抽空我准备学学 make,自动构建工具真他妈的好用,省了我不少操作。如果 objective-c 里面支持的话就太好了。
另外查资料有说到 eclipse 支持一个叫 subclipse 的版本控制插件,有空我也得去试试。
另外就是我觉得 eclipse 啥都好,就是他妈的想让工程里面的文件显示在 mac 的Finder 里面操作比较繁琐。
首先要去的工程中文件的属性,获取文件所在的路径,再打开finder,command+shift+g 前往目标文件夹...
无比蛋疼,无比纠结,当你只是偶尔这么来来也就罢了,总这么麻烦的弄一个操作,真的会给纠结个半死的。。
所以我准备有空的时候给 eclipse 写个插件,在右键菜单里面集成一个在 Finder 中打开的选项。
我也查过一些资料,也有一些现成的插件(easy**,etc),弄了下没一个能用的(可能只是限于windows平台),不知道是什么原因,不去管了
4。复习了一下Java编码的东西,打开了我许久的心结,值了!!今后在不为Java这个字符编码问题烦恼才好~
给几个有用的相关连接予以参考:
从Html文件中读取的中文字符都是问号????,高手进来指教(急,在线等)
我付出了,我该得到回报,这个回报便是,我今后再也不用机械性的干某些重复的体力劳动了,
有了这一点,我已欣慰无憾~
上关键代码~
- /**
- *读取文件为一个内存字符串,保持文件原有的换行格式
- *@paramfile文件对象
- *@paramcharset文件字符集编码
- *@return文件内容的字符串
- */
- publicstaticStringfile2String(Filefile,Stringcharset){
- StringBuffersb=newStringBuffer();
- try{
- FileInputStreamfis=newFileInputStream(file);
- InputStreamReaderisr=newInputStreamReader(fis,charset);
- BufferedReaderbr=newBufferedReader(isr);
- LineNumberReaderreader=newLineNumberReader(br);
- Stringline;
- while((line=reader.readLine())!=null){
- sb.append(line).append(System.getProperty("line.separator"));
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
- returnsb.toString();
- }
- /**
- *@authorBruceYang
- *该方法用于配合上面的方法使用。
- *
- *问题环境:mac10。7。2lion,eclipse(项目编码不支持切换到GBK)。project编码为utf8
- *是因为我发现一个问题,如果直接在eclipse里面执行转换编码的主程序的话,
- *是能够得到中文的转换结果的。
- *但是后来我要将主程序打成一个jar包通过命令行调用来进行使用。
- *这时候我遇到了一些列的问题:
- *1。一般情况下,java工程很少有不依赖于其他外部jar包的。
- *我的第一个问题便是:怎么将主程序jar所依赖的外部jar包捆成同一个jar。
- *解决方案是通过ant的一个标签。这个标签能够有力的抽取外部jar包的class文件。
- *将抽取出来的class文件和我所编写的java文件编译成的class文件捆成一个jar。
- *
- *2。第二个问题便是,如何将GBK转换为utf8编码。
- *也找了蛮久,不过总算是解决了,解决方案就是通过本类的file2String方法。
- *我怎么都没想到:
- *FileInputStreamfis=newFileInputStream(myFile);
- *InputStreamReaderisr=newInputStreamReader(fis,charset);
- *竟然有这么大的威力,回想一下,我也就是省略了传入字符集编码参数这一点,
- *直接用了:
- *BufferedReaderin=newBufferedReader(newFileReader(myFile));
- *很蛋疼,一直为字符编码的问题而苦恼,今天终于算是狠狠地出了一口恶气!
- *话说到这里也算是结了,因为通过在eclipse里面的run命令执行转码操作以后,
- *以前windows里面gbk编码的项目中的中文确实不再是乱码了.
- *(windows是以GBK对中文作支持,而MacOSX对中文的支持则是通过UTF-8,
- *所以将windows里面的GBK编码的项目转移到mac上来以后,真真蛋疼!!)
- *但是好景不长。在我将整个工程打成jar包准备今后用命令行调用进行转码操作的时候,
- *发现他妈的又不行了,转换出来的东西又是一团问号了...
- *无语无聊之际,我对比了一下正常转换为中文的文件,发现问号的数目和中文的数目是相一致的。
- *也就是说,一个问号能完美的匹配一个中文字符。
- *ok,我有点儿明白了。也许是因为得到的编码还是不够好~
- *
- *3。进入第三个问题的环节。
- *经过上面所发现的小猫腻。我有了如下的想法:
- *或许上面的方法仅仅能够保证从文件中读取的字符串编码数据不失真,
- *但并不能够保证控制台所使用的编码格式与上述方法所读入的“Java核心通用编码格式”相兼容,
- *("Java核心通用编码格式"是我按自己的理解所起的一名儿,或许理解的不正确)
- *我所知晓的是,Mac是以UTF-8编码对中文作支持的,
- *那么,或许我该试一下,将字符串转换为UTF-8编码,
- *走了点儿*运,一不小心竟然得到了正常的中文字符~
- *
- *总结:
- *乱码的问题折腾了我很久,相信其他很多人也都这样,
- *真不知道是该怪自己理解能力差,还是java在这一块儿的api确实还做的不够
- *同时想一想欧美使用英语作为主语的国家,根本就不用管这些东西,我就更加的心里不平衡
- *丫的,为什么对中国人这么不公平!!!我嚎,我嚎,我嚎,我嚎,我嚎,我嚎!!
- *
- *@paraminput
- *@return
- */
- publicstaticStringchangeEncode(Stringinput){
- Stringutf8String=null;
- try{
- utf8String=newString(input.getBytes("UTF-8"));
- }catch(UnsupportedEncodingExceptione){
- e.printStackTrace();
- }
- returnutf8String;
- }
上点编码转换前后的对比图: