unix系统编码 java_一项浩大的JAVA编码工程(与unix兼容乱码问题)

注:开发IDE是eclilpse,本地开发环境是windows,测试环境是linux

项目之前是一位兄弟开发的,项目编码为GBK编码,半路做其它项目,我接接手,一次也没布署过测试环境。

我在本地一切开发好之后,测试没有问题,布到linux上就有乱码问题。

找了半天终于找到原因,测试服务器linux上是UTF-8编码,使用locale命令查看:

LANG=en_US.UTF-8

LC_CTYPE="en_US.UTF-8"

LC_NUMERIC="en_US.UTF-8"

LC_TIME="en_US.UTF-8"

LC_COLLATE="en_US.UTF-8"

LC_MONETARY="en_US.UTF-8"

LC_MESSAGES="en_US.UTF-8"

LC_PAPER="en_US.UTF-8"

LC_NAME="en_US.UTF-8"

LC_ADDRESS="en_US.UTF-8"

LC_TELEPHONE="en_US.UTF-8"

LC_MEASUREMENT="en_US.UTF-8"

LC_IDENTIFICATION="en_US.UTF-8"

LC_ALL=

无奈,只得把项目中所有带GBK的地方全部改成UTF-8,这包括: web.xml

所有的jsp页面: 

这些还罢了,最麻烦的是所有的类文件都要编译为UTF-8编码的,具体操作为:

在eclipse中选中一个JAVA文件,右击 -> properties -> Text file encoding 修改为UTF-8,

可这样一修改,JAVA文件中所有的中文字符全部变成了乱码,解决的办法为:

先把JAVA文件修改为GBK编码,Ctrl+A全部选择,再把JAVA文件修改为UTF-8编码,在类文件中Ctrl+A全选,删掉,再Ctrl+V粘贴刚才复制的内容。

好,大功告成!

可这只是修改了一个JAVA文件!什么??!!!! 对,你工程里有多少个JAVA文件都要这样修改,否则就会有以下后果

1、所有JAVA类中的中文注释都不可用(这个在某种情况下可以舍弃)2

2、所有JAVA类中中文消息(存储在request中供在JSP中显示的)全部为乱码,这样JSP中不管如何设置,始终是乱码!!

于是,一项浩大的编码改造工程开始了。。。。。

不能直接改linux服务器上的编码吗?

如果不能那真是悲剧...

不过可以考虑自己写程序来改啊

使用程序来改,不知道正不正确:

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileFilter;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.Reader;

import java.io.Writer;

public class FileEncodingConverter {

// Java file extention

public static final String FILE_EXTENTION_JAVA = ".java";

public static final int BUFFER_SIZE = 1024 * 4;

// File encoding

public static final String FILE_ENCODING_UTF8 = "UTF-8";

public static final String FILE_ENCODING_GBK = "GBK";

public static final String FILE_ENCODING_GB2312 = "gb2312";

/**

* File filter, only directory and java file

*/

private static FileFilter fileFilter = new FileFilter() {

public boolean accept(File file) {

// directory and java file

return file.isDirectory()

|| (file.isFile() && file.getName().endsWith(FILE_EXTENTION_JAVA));

}

};

/**

* @param sourceDirectoryPath

* sourceDirectory

* @param destDirectoryPath

* destDirectory

* @param sourceFileEncoding

* sourceEncoding

* @param destFileEncoding

* destEncoding

*/

public static void scanDirectory(String sourceDirectoryPath,

String destDirectoryPath, String sourceFileEncoding,

String destFileEncoding) {

File destDirectory = new File(destDirectoryPath);

if (!destDirectory.exists()) {

destDirectory.mkdir();

}

File sourceDirectory = new File(sourceDirectoryPath);

scanDirectory(sourceDirectory, sourceDirectoryPath, destDirectoryPath,

sourceFileEncoding, destFileEncoding);

}

/**

* @param directory

* directory

* @param sourceDirectoryPath

* sourceDirectory

* @param destDirectoryPath

* destDirectory

* @param sourceFileEncoding

* sourceEncoding

* @param destFileEncoding

* destEncoding

*/

private static void scanDirectory(File directory, String sourceDirectoryPath,

String destDirectoryPath, String sourceFileEncoding,

String destFileEncoding) {

File[] files = directory.listFiles(fileFilter);

File destFile;

for (File file : files) {

if (file.isDirectory()) {

destFile =

new File(destDirectoryPath

+ file.getAbsolutePath()

.substring(sourceDirectoryPath.length()));

if (!destFile.exists()) {

destFile.mkdir();

}

scanDirectory(file, sourceDirectoryPath, destDirectoryPath,

sourceFileEncoding, destFileEncoding);

} else {

System.out

.println("Source file:/t"

+ file.getAbsolutePath()

+ "/nDest file:/t"

+ (destDirectoryPath + file.getAbsolutePath().substring(

sourceDirectoryPath.length()))

+ "/n-----------------------------------------------------------------");

convertFile(file.getAbsolutePath(), destDirectoryPath

+ file.getAbsolutePath().substring(sourceDirectoryPath.length()),

sourceFileEncoding, destFileEncoding);

}

}

}

/**

* @param sourceFilePath

* sourceFilePath

* @param destFilePath

* destFilePath

* @param sourceFileEncoding

* sourceFileEncoding

* @param destFileEncoding

* destFileEncoding

*/

private static void convertFile(String sourceFilePath, String destFilePath,

String sourceFileEncoding, String destFileEncoding) {

InputStream in = System.in;

OutputStream out = System.out;

Reader reader = null;

Writer writer = null;

try {

// set up byte streams

if (sourceFilePath != null) {

in = new FileInputStream(sourceFilePath);

}

if (destFilePath != null) {

out = new FileOutputStream(destFilePath);

}

// Use default encoding if no encoding is specified.

if (sourceFileEncoding == null)

sourceFileEncoding = System.getProperty("file.encoding");

if (destFileEncoding == null)

destFileEncoding = System.getProperty("file.encoding");

// Set up character stream

reader =

new BufferedReader(new InputStreamReader(in, sourceFileEncoding));

writer =

new BufferedWriter(new OutputStreamWriter(out, destFileEncoding));

char[] buffer = new char[BUFFER_SIZE];

int len;

while ((len = reader.read(buffer)) != -1) {

writer.write(buffer, 0, len);

}

} catch (Exception e) {

e.printStackTrace();

} finally {

if (writer != null) {

try {

writer.flush();

writer.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (reader != null) {

try {

reader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

try {

in.close();

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

String sourceDirectoryPath = "D://Dev//workspace//ProjectTest//src";

String destDirectoryPath = "D://Dev//workspace//ProjectTest//dest";

scanDirectory(sourceDirectoryPath, destDirectoryPath, FILE_ENCODING_GBK,

FILE_ENCODING_UTF8);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值