java字符集编码是,java字符集与编码有关问题

java字符集与编码问题

没想到自己的第一篇javaeye博客就是让人头痛的java字符集转码问题,下面是我个人的一些认识与网上收集的代码。在java中String在JVM里是unicode的,任何byte[]到String以及String到byte[]都涉及到字符集编码转换。基本规则是:

从byte[] 到String就是按某一个编码后的字节数组转换为unicode的字符串,从String到 byte[]是将unicode的字符串编码为唯一特定字符集编码后的字节数组。也就是说,Java编译时候,会将java文件的编码按照指定编码或者系统默认的编码转换为Unicode并加载到内存中进行编译。

public String(byte[] bytes)

这个方法就是完成将bytes[]转码为unicode的String。

使用的是jvm默认的字符集编码。

如果用户指定某一个charsetName,可以是UTF-8,GBK之类的。

public String(byte[] bytes, String charsetName)

两者都是完成specCharset到unicode的过程,而不是说改变编码格式为charsetName指定的字符集编码

同理

public byte[] getBytes()

public byte[] getBytes(String charsetName)

这两个方法就是完成从unicode到指定字符集编码的“转码”过程。

在浏览器中,http请求的parameter到servlet里后,应用服务器已经自动完成了new String(parameterBytes,browserSpecCharset)这个过程。

即,自动用页面设置的charset转码parameterBytes字节数组为unicode的字符串。

下面是网上找的一个转码器的例子,经测试比较好用,大家可以自己试试

package lavasoft.common;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import java.io.*;

/**

* 转码工具,全面支持文件、字符串的转码

*

* @author Administrator 2009-11-29 16:14:21

*/

public class EncodingToolkit {

private static Log log = LogFactory.getLog(EncodingToolkit.class);

public static void main(String[] args) {

String han = "汉";

System.out.println("---------");

}

/**

* 对字符串重新编码

*

* @param text 字符串

* @param resEncoding 源编码

* @param newEncoding 新编码

* @return 重新编码后的字符串

*/

public static String reEncoding(String text, String resEncoding, String newEncoding) {

String rs = null;

try {

rs = new String(text.getBytes(resEncoding), newEncoding);

} catch (UnsupportedEncodingException e) {

log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码");

throw new RuntimeException(e);

}

return rs;

}

/**

* 重新编码Unicode字符串

*

* @param text 源字符串

* @param newEncoding 新的编码

* @return 指定编码的字符串

*/

public static String reEncoding(String text, String newEncoding) {

String rs = null;

try {

rs = new String(text.getBytes(), newEncoding);

} catch (UnsupportedEncodingException e) {

log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码" + newEncoding);

throw new RuntimeException(e);

}

return rs;

}

/**

* 文本文件重新编码

*

* @param resFile 源文件

* @param resEncoding 源文件编码

* @param distFile 目标文件

* @param newEncoding 目标文件编码

* @return 转码成功时候返回ture,否则false

*/

public static boolean reEncoding(File resFile, String resEncoding, File distFile, String newEncoding) {

boolean flag = true;

InputStreamReader reader = null;

OutputStreamWriter writer = null;

try {

reader = new InputStreamReader(new FileInputStream(resFile), resEncoding);

writer = new OutputStreamWriter(new FileOutputStream(distFile), newEncoding);

char buf[] = new char[1024 * 64]; //字符缓冲区

int len;

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

writer.write(buf, 0, len);

}

writer.flush();

writer.close();

reader.close();

} catch (FileNotFoundException e) {

flag = false;

log.error("没有找到文件,转码发生异常!");

throw new RuntimeException(e);

} catch (IOException e) {

flag = false;

log.error("读取文件为一个内存字符串失败,失败原因是读取文件异常!");

throw new RuntimeException(e);

} finally {

if (reader != null) try {

reader.close();

} catch (IOException e) {

flag = false;

throw new RuntimeException(e);

} finally {

if (writer != null) try {

writer.close();

} catch (IOException e) {

flag = false;

throw new RuntimeException(e);

}

}

}

return flag;

}

/**

* 读取文件为一个Unicode编码的内存字符串,保持文件原有的换行格式

*

* @param resFile 源文件对象

* @param encoding 文件字符集编码

* @return 文件内容的Unicode字符串

*/

public static String file2String(File resFile, String encoding) {

StringBuffer sb = new StringBuffer();

try {

LineNumberReader reader = new LineNumberReader(new BufferedReader(new InputStreamReader(new FileInputStream(resFile), encoding)));

String line;

while ((line = reader.readLine()) != null) {

sb.append(line).append(System.getProperty("line.separator"));

}

reader.close();

} catch (UnsupportedEncodingException e) {

log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码" + encoding);

throw new RuntimeException(e);

} catch (FileNotFoundException e) {

log.error("读取文件为一个内存字符串失败,失败原因所给的文件" + resFile + "不存在!");

throw new RuntimeException(e);

} catch (IOException e) {

log.error("读取文件为一个内存字符串失败,失败原因是读取文件异常!");

throw new RuntimeException(e);

}

return sb.toString();

}

/**

* 使用指定编码读取输入流为一个内存Unicode字符串,保持文件原有的换行格式

*

* @param in 输入流

* @param encoding 构建字符流时候使用的字符编码

* @return Unicode字符串

*/

public static String stream2String(InputStream in, String encoding) {

StringBuffer sb = new StringBuffer();

LineNumberReader reader = null;

try {

reader = new LineNumberReader(new BufferedReader(new InputStreamReader(in, encoding)));

String line;

while ((line = reader.readLine()) != null) {

sb.append(line).append(System.getProperty("line.separator"));

}

reader.close();

in.close();

} catch (UnsupportedEncodingException e) {

log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码" + encoding);

throw new RuntimeException(e);

} catch (IOException e) {

log.error("读取文件为一个内存字符串失败,失败原因是读取文件异常!");

throw new RuntimeException(e);

} finally {

if (in != null) try {

in.close();

} catch (IOException e) {

log.error("关闭输入流发生异常!", e);

throw new RuntimeException(e);

}

}

return sb.toString();

}

/**

* 字符串保存为制定编码的文本文件

*

* @param text 字符串

* @param distFile 目标文件

* @param encoding 目标文件的编码

* @return 转换成功时候返回ture,否则false

*/

public static boolean string2TextFile(String text, File distFile, String encoding) {

boolean flag = true;

if (!distFile.getParentFile().exists()) distFile.getParentFile().mkdirs();

OutputStreamWriter writer = null;

try {

writer = new OutputStreamWriter(new FileOutputStream(distFile), encoding);

writer.write(text);

writer.close();

} catch (IOException e) {

flag = false;

log.error("将字符串写入文件发生异常!");

throw new RuntimeException(e);

} finally {

if (writer != null) try {

writer.close();

} catch (IOException e) {

log.error("关闭输出流发生异常!", e);

throw new RuntimeException(e);

}

}

return flag;

}

}

1 楼

jyjava

2011-12-29

流为啥要关闭两次

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql序列号生成_一文看懂mycat的6种全局序列号实现方式

概述在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式。下面对这几种实现方式做一下介绍。1、本地文件方式原理:此方式 My…

android.graphics.Paint方法setXfermode (Xfermode x...

[java] view plaincopymPaint new Paint(); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN)); 常见的Xfermode(SRC为原图,DST为目标图),把代码中的SRC_IN换成下图指定的模式就会出现对应的效果图…

从零开始的全栈工程师——html篇1

全栈工程师也可以叫web 前端 H5主要是网站 app 小程序 公众号这一块 HTML篇 html(超文本标记语言,标记通用标记语言下的一个应用。) “超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。 超文本标记语言的结构包括“头”部分&am…

二分+树的直径 [Sdoi2011]消防

问题 D: [Sdoi2011]消防 时间限制: 1 Sec 内存限制: 512 MB 提交: 12 解决: 6 [提交][状态][讨论版] 题目描述 某个国家有n个城市&#xff0c;这n个城市中任意两个都连通且有唯一一条路径&#xff0c;每条连通两个城市的道路的长度为zi(zi<1000)。 这个国家的人对火焰…

使用MRUnit测试Hadoop程序

这篇文章将略微绕开使用MapReduce实现数据密集型处理中的模式&#xff0c;以讨论同样重要的测试。 汤姆•惠勒 &#xff08; Tom Wheeler&#xff09;在纽约2012年Strata / Hadoop World会议上参加的一次演讲给了我部分启发。 处理大型数据集时&#xff0c;想到的并不是单元测试…

android之 TextWatcher的监听

以前用过android.text.TextWatcher来监听文本发生变化&#xff0c;但没有仔细去想它&#xff0c;今天兴致来了就发个疯来玩玩吧&#xff01; 有点担心自己理解错&#xff0c;所以还是先把英文API解释给大家看看 1、什么情况下使用了&#xff1f; When an object of a type is a…

php 秒杀并发怎么做,PHP实现高并发下的秒杀功能–Laravel

namespace App\Http\Controllers\SecKill;use App\Http\Controllers\Controller;use Exception;use Illuminate\Support\Facades\DB;use Illuminate\Support\Facades\Redis;class SecKillController extends Controller{/*** 往redis的隊列中添加庫存(用於測試的數據)**/public…

苹果mp3软件_优秀的Apple音乐转换器,将任何iTunes M4P,AAX,AA转换为MP3

Macsome iTunes Converter是一款优秀的音频转换工具&#xff0c;这款音频转换软件能够帮助大家快速进行音频格式转换&#xff0c;使得您可以自由的播放和分享自己喜爱的音频文件。同时这款软件与大多数音频转换软件一样&#xff0c;将受到保护DRM的Apple音乐转换转换成MP3, AAC…

Vuejs开发环境搭建及热更新

一、安装NPM 1.1最新稳定版本&#xff1a; npm install vue 二、命令行工具安装 国内速度慢&#xff0c;使用淘宝镜像&#xff1a; npm install -g cnpm --registryhttps://registry.npm.taobao.org 注意&#xff1a;以后使用npm的地方就替换成cnpm 1、全局安装vue-vli ​ …

线索二叉树的C语言实现

#include "string.h"#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1#define ERROR 0#define TRUE 1#define FALSE 0 #define MAXSIZE 100 /* 存储空…

发送带有接缝的活动邀请

这些天来&#xff0c;我的一位同事在使用带有接缝&#xff08;2.x版&#xff09;的邮件模板发送事件邀请时遇到了问题。 从根本上讲&#xff0c;这不是一个艰巨的任务&#xff0c;因此我将简要说明使用接缝邮件模板发送事件邀请需要做什么。 发送邮件邀请时&#xff0c;您需要发…

Oracle内存管理(之二)

Oracle内存管理&#xff08;之二&#xff09; 【深入解析--eygle】 学习笔记 1.2.2 UGA和CGA UGA&#xff08;用户全局区&#xff09;由用户会话数据、游标状态和索引区组成。在共享server模式下&#xff0c;一个共享服务进程被多个用户进程共享&#xff0c;此时UGA是Shared Po…

matlab抓取股票数据,Matlab经过sina web接口获取个数即时股票数据函数实现代码

Matlab通过sina web接口获取个数即时股票数据函数实现代码代码如下&#xff1a;function stockinfo queryprice(stocktype, stockid)%stocktype 股票类型&#xff1a;sh和sz%stockid 股票编码&#xff1a;url sprintf(http://hq.sinajs.cn/list%s%d, stocktype, stockid);[so…

虚幻4毛发系统_虚幻引擎复活!苹果与Epic对决,有哪些游戏险些中枪?

最近&#xff0c;苹果和Epic的官司闹得沸沸扬扬。随着Epic旗下热门手游《堡垒之夜》遭苹果火速下架&#xff0c;两大巨头之间的冲突愈演愈烈。苹果似乎并不满足于此&#xff0c;由于Epic公开违反自家规定&#xff0c;苹果计划进一步封禁Epic维护虚幻引擎的开发者账户&#xff0…

史上最全的HTML和CSS标签常用命名规则

文件夹主要建立以下文件夹&#xff1a;  1、Images 存放一些网站常用的图片&#xff1b;  2、Css 存放一些CSS文件&#xff1b;  3、Flash 存放一些Flash文件&#xff1b;  4、PSD 存放一些PSD源文件&#xff1b;  5、Temp 存放所有临时图片和其它文件&#xff1b; …

01-JAVA语言基础

1.设计思想&#xff1a; 先以字符串的形式输入两个数字&#xff0c;然后将他们转化为int类型&#xff0c;再对两数进行相加&#xff0c;最后输出结果。 2.程序流程图&#xff1a; 3.源程序代码&#xff1a; import java.util.Scanner;public class Addition2 {public static vo…

与JodaTime的DateTime和Google Guava的供应商嘲笑

介绍 如果您是经验丰富的单元测试人员&#xff0c;那么当您看到任何与时间 &#xff0c; 并发性 &#xff0c; 随机性 &#xff0c; 持久性和磁盘I / O协同工作的代码时&#xff0c;您就会学会做笔记。 原因是测试可能非常脆弱&#xff0c;有时完全无法正确测试。 这篇文章将展…

栈实现 C语言

最近上来写了一下栈&#xff0c;理解数据结构的栈。 头文件&#xff1a;stack.h 初始化栈结构与函数定义&#xff1a; #include<stdlib.h> #include <stdio.h> #include<memory.h> #define N 100struct stack {int data[N];int top;//标识栈顶 }; typedef s…

php签名墙,肺功能检查质量控制网

2017年12月2日&#xff0c;由中华医学会呼吸病学分会/儿科分会、国家呼吸系统疾病临床医学研究中心、国家呼吸疾病医疗质量控制中心、中国肺功能联盟、中国儿童肺功能协作组主办&#xff0c;浙江省中医院承办的"2017年中国肺功能检查规范化培训及应用推广学习班暨肺功能检…

餐饮水单打印软件_开发一款餐饮手机app系统软件什么价格?有哪些方面需要考虑?...

开发一款餐饮手机app系统软件什么价格&#xff1f;有哪些方面需要考虑&#xff1f;近年来&#xff0c;餐饮类的APP如雨后春笋般快速增长&#xff0c;无论是上档次的酒店&#xff0c;还是各大餐厅&#xff0c;都有各自的专属APP。餐饮APP的开发能让大型酒店/餐厅获得更多盈利、销…