java utf8编码转换gbk怎么把gbk转utf-8

批量将Java源代码文件的编码从GBK转为UTF-8 - 香巴拉 - 博客园
随笔 - 73, 文章 - 2, 评论 - 7, 引用 - 0
主要参考:
http://blog.csdn.net/liu_qiqi/article/details/
http://www.oschina.net/code/snippet_
/java0721/archive//2602963.html
&把自己修改过的代码贴上来。依赖的包没办法提供了。
package org.xc.
import info.monitorenter.cpdetector.io.ASCIID
import info.monitorenter.cpdetector.io.CodepageDetectorP
import info.monitorenter.cpdetector.io.JChardetF
import info.monitorenter.cpdetector.io.ParsingD
import info.monitorenter.cpdetector.io.UnicodeD
import java.io.F
import java.util.C
import mons.io.FileU
public class GBK2UTF8App {
* 将制定目录下的所有Java源文件的编码格式从GBK修改为UTF-8
public static void main(String[] args) throws Exception {
// GBK编码格式源码路径
//String srcDirPath = "D:\\workspace-yaoxiao2\\StoreWebWork\\src";
String srcDirPath = "D:\\workspace-yaoxiao2\\StoreEJB\\src";
// 转为UTF-8编码格式源码路径
String utf8DirPath = "D:\\ldx\\utf8\\src2";
String charsetNameUtf8="UTF-8";
// 获取所有java文件
Collection&File& javaGbkFileCol = FileUtils.listFiles(new File(srcDirPath), new String[] { "java" }, true);
for (File javaGbkFile : javaGbkFileCol) {
// UTF8格式文件路径
String utf8FilePath2 = utf8DirPath + javaGbkFile.getAbsolutePath().substring(srcDirPath.length());
String srcDirPath2 = srcDirPath + javaGbkFile.getAbsolutePath().substring(srcDirPath.length());
// 使用GBK读取数据,然后用UTF-8写入数据
String charsetName = getFileEncode(srcDirPath2);
if(!charsetNameUtf8.equals(charsetName)){
System.out.println(javaGbkFile.getName() +":"+ charsetName);
FileUtils.writeLines(new File(utf8FilePath2), "UTF-8", FileUtils.readLines(javaGbkFile, charsetName));
* 利用第三方开源包cpdetector获取文件编码格式
* @param path
要判断文件编码格式的源文件的路径
* @author huanglei
* @version
public static String getFileEncode(String path) {
* detector是探测器,它把探测任务交给具体的探测实现类的实例完成。
* cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法 加进来,如ParsingDetector、
* JChardetFacade、ASCIIDetector、UnicodeDetector。
* detector按照&谁最先返回非空的探测结果,就以该结果为准&的原则返回探测到的
* 字符集编码。使用需要用到三个第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar
* cpDetector是基于统计学原理的,不保证完全正确。
CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
* ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于
* 指示是否显示探测过程的详细信息,为false不显示。
detector.add(new ParsingDetector(false));
* JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码
* 测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以
* 再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。
detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar
// ASCIIDetector用于ASCII编码测定
detector.add(ASCIIDetector.getInstance());
// UnicodeDetector用于Unicode家族编码的测定
detector.add(UnicodeDetector.getInstance());
java.nio.charset.Charset charset =
File f = new File(path);
charset = detector.detectCodepage(f.toURI().toURL());
} catch (Exception ex) {
ex.printStackTrace();
if (charset != null)
return charset.name();
URL url = CreateStationTreeModel.class.getResource("/resource/" +
* "配置文件"); URLConnection urlConnection = url.openConnection();
* inputStream=urlConnection.getInputStream(); String charsetName =
* getFileEncode(url); System.out.println(charsetName); BufferedReader in =
* new BufferedReader(new InputStreamReader(inputStream, charsetName));详细阐述PHP环境下如何将GBK编码转成UTF-8格式
apache 字符集 GB 2312
mysql 字符集 GBK
现要从 mysql 中提出信息(GBK) 写入到 XML 中
XML中的编码格式是 UTF-8
那么,如何将GBK编码成 UTF8 ??
前一阵子见到了qiushuiwuhen君的关于gbk,unicode,big5的转换的
但是多少有一些不太大的问题
于是我设计了一个负责字符转换的类,修正了其中的一些不足,增加了部分功能,以后我会不断扩充该类,来支持更多的字符集
增加了如下几点:
unicode-&gbk 符号部分的转换
欧元符的识别
big5,Unicode,GBK之间的相互转换,前提是只转换共同的字符集部分,
暂时程序支持以下字符编码方式:
GBK,BIG5,UTF-16BE(Unicode big-endian字节顺序),UTF-16LE(Unicode little-endian字节顺序),UTF-8
默认输入编码方式为GBK,默认输出编码方式为UTF-16BE;
该类别提供两个函数用来修改输入和输出编码方式:
修改输入编码方式 boolean SetGetEncoding(string $GetEncoding)
修改输出编码方式 boolean SetToEncoding(string $ToEncoding)
函数参数只能使用上述5种编码方式,区分大小写,如GBK不能写成gbk
假如设置成功,返回true,假如使用了错误的编码名,返回false,并现实错误信息
string EncodeString(string $String)
负责进行字符编码转换,返回转换后的字符串
使用前,请将var $FilePath=""变量该为该程序文件的绝对路径,否则将会找不到数据文件
将gbk编码的字符串转化为UTF-8编码:
$s="GBK编码";
$CharEncoding=new Encoding();
$CharEncoding-&SetGetEncoding("GBK")||die("编码名错误");
$CharEncoding-&SetToEncoding("UTF-8")||die("编码名错误");
echo $CharEncoding-&EncodeString($s);
在浏览器中使用UTF-8编码察看,将会看到正确的字符public static String getUTF8StringFromGBKString(String gbkStr) {
return new String(getUTF8BytesFromGBKString(gbkStr), "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new InternalError();
public static byte[] getUTF8BytesFromGBKString(String gbkStr) {
int n = gbkStr.length();
byte[] utfBytes = new byte[3 * n];
int k = 0;
for (int i = 0; i & i++) {
int m = gbkStr.charAt(i);
if (m & 128 && m &= 0) {
utfBytes[k++] = (byte)
utfBytes[k++] = (byte) (0xe0 | (m && 12));
utfBytes[k++] = (byte) (0x80 | ((m && 6) & 0x3f));
utfBytes[k++] = (byte) (0x80 | (m & 0x3f));
if (k & utfBytes.length) {
byte[] tmp = new byte[k];
System.arraycopy(utfBytes, 0, tmp, 0, k);
return utfB
chen_yongkai
浏览: 42623 次
来自: 福州
兄弟,你这个算长连接应用吗?不关闭stream,不关闭sock ...
可以使用,谢谢博主
davidchouwolf 写道也碰到一个类似的应用,需要长连 ...
也碰到一个类似的应用,需要长连接,客户端大约是两三千个,那么服 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'java 把gbk字符串转为UTF8 的解决方案 - ITeye问答
网上找了很多都不行啊 大家能不能帮下忙 全部分都给了
看看这个 /downgoon/gbk2utf8& 直接提供了工具,下载先来,一条命令全搞定。java -jar gbk2utf8-0.0.1-SNAPSHOT-all.jar $src-gbk-path $dst-utf8-path
而且关键是,如果源目录中既有GBK,又有UTF-8,很多工具最终笼统的对每个文件都 GBK -& UTF-8,会导致原本就是UTF-8,被误做GBK转码,最后出来的反而是乱码的,这个工具首先识别了源文件是否是GBK,只有是GBK的才转,不是GBK的直接跳过。
看个例子:
String s1 = "hello中国人";
String iso = new String(s1.getBytes("utf-8"), "iso-8859-1");
System.out.println(iso);//hello?,-?? 1/2 ???
String utf8 = new String(iso.getBytes("iso-8859-1"), "utf-8");
System.out.println(utf8);//hello中国人
String s1 = "hello中国人";
String gbk = new String(s1.getBytes("utf-8"), "gbk");
System.out.println(gbk);//hello涓?浗浜?
String utf8 = new String(gbk.getBytes("gbk"), "utf-8");
System.out.println(utf8);//hello中国??
并不是什么中文奇数偶数的问题,刚好偶数个中文可以成功,可以说是巧合也可是说不是巧合。
总之,用什么编码就用什么解码,如果已经是乱码了,可能可以恢复,也可能恢复不了。能恢复的前提是,产生乱码时用的是单字节编码。
这篇文章应该能帮到你,编码问题汇总-http://www.blogjava.net/zhangchao/archive//351051.html
呵呵,没想到我的答案被评价为没有价值的,sigh。
好吧,看来不仔细说明不行。 程序员的读代码能力是很重要滴。
首先,java在内存中是使用的双字节字符unicode的编码方式。
每个char对应的是32位的整型。
内存中对字符串操作其实不用考虑字符集。
只有在读取到内存中,和输出时,需要考虑字符集转换。
如果源代码中包含中文字符串,java编译器会按照编译时指定的字符集转换到unicode。
(不指定时,按当前操作系统的配置来)
当一个java程序从外部获取字符串时,使用Reader系列类,
会按照默认或者指定的字符集读取,然后转换到unicode。
也就是为啥我在读文件时 指定了 Charset.forName("GBK")
单纯的InputStream类不能处理字符集。
需要utf-8一般是为了输出。有两种方式,一种,使用Writer,内置了字符集转换能力。
选择合适的,然后在构造函数中指定即可。(有Writer是往OutputStream输出的,一下想不起名字了)
还有一种就是,自己用String的getBytes(charset)方法,得到转换过后的编码的二进制数组,然后对这个数组处理。比如我的代码中的FileOutputStream
奇数个汉字直接gbk转utf-8乱码,可以使用以下:
String gbk = "我来了";
String iso = new String(gbk.getBytes("UTF-8"),"ISO-8859-1");
String utf8=new String(iso.getBytes("ISO-8859-1"),"UTF-8");
,具体原理请参考:
下面还有一种方式getUTF8StringFromGBKString(从其它博客转过来的),可供你参考:
import java.io.UnsupportedEncodingE
public class TestEncoder {
* @param args
public static void main(String[] args) throws Exception {
String gbk = "iteye问答频道编码转换问题";
String iso = new String(gbk.getBytes("UTF-8"),"ISO-8859-1");
System.out.println(iso);
String utf8 = new String(iso.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(utf8);
System.out.println(getUTF8StringFromGBKString(gbk));
public static String getUTF8StringFromGBKString(String gbkStr) {
return new String(getUTF8BytesFromGBKString(gbkStr), "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new InternalError();
public static byte[] getUTF8BytesFromGBKString(String gbkStr) {
int n = gbkStr.length();
byte[] utfBytes = new byte[3 * n];
int k = 0;
for (int i = 0; i & i++) {
int m = gbkStr.charAt(i);
if (m & 128 && m &= 0) {
utfBytes[k++] = (byte)
utfBytes[k++] = (byte) (0xe0 | (m && 12));
utfBytes[k++] = (byte) (0x80 | ((m && 6) & 0x3f));
utfBytes[k++] = (byte) (0x80 | (m & 0x3f));
if (k & utfBytes.length) {
byte[] tmp = new byte[k];
System.arraycopy(utfBytes, 0, tmp, 0, k);
return utfB
public class TestEncoder {
* @param args
public static void main(String[] args) throws Exception {
String gbk = "iteye问答频道编码转换问题";
String iso = new String(gbk.getBytes("UTF-8"),"ISO-8859-1");
System.out.println(iso);
String utf8 = new String(iso.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(utf8);
import java.io.F
import java.io.FileInputS
import java.io.FileOutputS
import java.io.IOE
import java.io.InputStreamR
import java.io.PrintW
import java.nio.charset.C
public class StringConverter {
private static void convertFile(File src, String outputFile) throws IOException {
char[] buf = new char[1024];
StringBuilder strb = new StringBuilder();
InputStreamReader isr =
isr = new InputStreamReader(new FileInputStream(src), Charset.forName("GBK"));
int readCount = 0;
while ( -1 != (readCount =isr.read(buf))) {
strb.append(buf, 0, readCount-1);
} finally {
if (isr!=null) {
isr.close();
} catch (IOException e) {
// first method to output
PrintWriter pw =
pw = new PrintWriter(outputFile+"1.txt", "utf-8");
pw.write(strb.toString());
pw.flush();
} finally {
if (null != pw) {
pw.close();
// second method to output
FileOutputStream fos =
fos = new FileOutputStream(outputFile+"2.txt");
fos.write(strb.toString().getBytes("utf-8"));
fos.flush();
} finally {
if (fos!=null) {
fos.close();
} catch (IOException e) {
public static void main(String[] args) throws IOException {
convertFile(new File("content.txt"), "converted");
已解决问题
未解决问题JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换
&&JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 java文件gbk转utf8 的文章

 

随机推荐