重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
public
隆林网站建设公司创新互联,隆林网站设计制作,有大型网站制作公司丰富经验。已为隆林数千家提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的隆林做网站的公司定做!
byte[]
getBytes(String
charsetName)
使用指定的字符集将此String编码为byte序列,结果存在一个byte数组中
public
String(byte[]
bytes,
String
charsetName)
通过使用指定的
charset
解码指定的
byte
数组,构造一个新的
String。
在网络传输中,信息都是以字节序列的方式传输的。所以,发送方的String要按照某种编码方式(如UTF-8,GBK)编码为字节序列,在网络中传输后,接收方取得这个字节序列,按照相同的编码方式将字节序列解码为String。
请看下面的代码片段:
String
name
=
"张三";
byte[]
b1
=
name.getBytes("UTF-8");
String
name1
=
new
String(b1,
"UTF-8");
//编码解码相同,正常显示
System.out.println(name1);
String
name2
=
new
String(b1,
"GBK");
//编码解码不同,乱码
System.out.println(name2);
byte[]
b2
=
name.getBytes("GBK");
String
name3
=
new
String(b2,
"GBK");
//编码解码相同,正常显示
System.out.println(name3);
String
name4
=
new
String(b2,
"UTF-8");
//编码解码不同,乱码
System.out.println(name4);
至于你的那个情况,要先用gbk编码,然后再用utf-8解码才能获得正常的字符串,我估计是因为
1.传输过来的字节码是用utf-8编码的,假设字节码为b。
2.你获得的那个字符串,假设为s,是用gbk对b进行解码获得的字符串,所以是乱码。
3.你使用gbk对s进行编码,用gbk解码之后再编码,于是获得了原来的b。
4.你使用utf-8解码,所以获得了正常的字符串。
简单的说:
b
-
(gbk解码)
-
乱码
-
[此处开始是你做的](gbk编码)
-
b
-
(utf-8解码)
-
正常字符串
研究完编码收获会不小的,对以后理解Java的输入输出(尤其是网络通信和文件读写)都很有帮助。
Java中字符串转码,根据实际运用的环境有以下三种方式
使用Java.lang.String这是最常用的方法,先用对应编码获取字节,然后重新构造新编码,示例代码如下:String s = "清山";
byte[] b = s.getBytes("utf-8");//编码
String sa = new String(b, "gb2312");//解码:用什么字符集编码就用什么字符集解码
java.io.InputStreamReader/OutputStreamWriter:桥转换读写文件的应用中,可以使用这种方式,直接在IO流构造中转换,示例代码如下:
InputStream is = new FileInputStream("C:/项目进度跟踪.txt");//文件读取
InputStreamReader isr = new InputStreamReader(is, "utf-8");//解码
OutputStream os = new FileOutputStream("C:/项目进度跟踪_gb2312.txt");//文件输出
OutputStreamWriter osw = new OutputStreamWriter(os, "gb2312");//开始编码
java.nio.Charset使用nio中的Charset转换字符,示例代码如下:Charset inSet = Charset.forName("utf-8"); // 解码字符集
Charset outSet = Charset.forName("gb2312"); // 编码字符集
CharsetDecoder de = inSet.newDecoder(); // 解码器
CharsetEncoder en = outSet.newEncoder();// 编码
//在连连看中,在合适的条件下,点到两个相同的图形时,这两个图形会消失,相当于删除这两个图形
//删除方法
private void delete(Point p1,final Point p2 , boolean bDelete){
//删除位置坐标列表的声明和实例化
ArrayListPoint points=new ArrayListPoint();
//当两个图形之间可直线连接时
if(corner1==null){
//将第一个图形加入删除列表
points.add(p1);
//将第二个图形加入删除列表
points.add(p2);
}//当只有一个拐弯时
else if(corner2==null){
points.add(p1);
points.add(corner1);
points.add(p2);
}//当有两个拐弯时
else{
if(p1.x!=corner1.xp1.y!=corner1.y){
Point pt=corner1;
corner1=corner2;
corner2=pt;
}
points.add(p1);
//将第一个拐角加入删除列表
points.add(corner1);
points.add(corner2);
points.add(p2);
}
//如果拐角多余两个,撤销选中目标
if(bDelete){
delete(p1); delete(p2);
}
//执行删除事件
notifyEffect(points);
}
//获取图形列数
public int getCols() {
return cols;
}
/*
* p 原点
*横向空白点(包括与原点等值的点)
*/
//横向连线路径获取
private ArrayListPoint getHSpaces(Point p,Point pg){
ArrayListPoint ps=new ArrayListPoint();
//左边空白点坐标
for(int dif=1; ;dif++){
//左边空白点y值
int col=p.y-dif;
//左边空白点x值
int row=p.x;
//如果已经完成或只有一列的情况,返回循环
if(col0||(data[row][col]!=0!pg.equals(new Point(row,col)))) break;
//将空白点行列添加进数组列表
ps.add(new Point(row,col));
}
//后面的和前面的类似了
//右边空白点坐标
for(int dif=1; ;dif++){
int col=p.y+dif;
int row=p.x;
if(col=cols||(data[row][col]!=0!pg.equals(new Point(row,col)))) break;
ps.add(new Point(row,col));
}
return ps;
}
public int[][] getMaps(){
return data;
}
public int getRows() {
return rows;
}
public Point getSltMatrix() {
return sltMatrix;
}
/*
* p 原点
*纵向空白点(包括与原点等值的点)
*/
//纵向连线路径获取
private ArrayListPoint getVSpaces(Point p,Point pg)
{
ArrayListPoint ps=new ArrayListPoint();
//左
for(int dif=1; ;dif++){
int col=p.y;
int row=p.x-dif;
if(row0||(data[row][col]!=0!pg.equals(new Point(row,col)))) break;
ps.add(new Point(row,col));
}
//右
for(int dif=1; ;dif++){
int col=p.y;
int row=p.x+dif;
if(row=rows||(data[row][col]!=0!pg.equals(new Point(row,col)))) break;
ps.add(new Point(row,col));
}
return ps;
}
[java] view plain copy
String name="I am 小明";
toHex(name.toCharArray());
span style="font-size:18px; white-space: pre;"/spanpre name="code" class="java"try{
byte[] iso8859=name.getBytes("ISO-8859-1");
[java] view plain copy
toHex(iso8859);
[java] view plain copy
byte[] gb2312=name.getBytes("GB2312");
[java] view plain copy
toHex(gb2312);
[java] view plain copy
byte[] gbk=name.getBytes("GBK");
[java] view plain copy
toHex(gbk);
[java] view plain copy
}
[java] view plain copy
String str="小米";
byte[] b=str.getBytes("UTF-8");
[java] view plain copy
public byte[] getBytes(String charsetName)
throws UnsupportedEncodingException {
if (charsetName == null) throw new NullPointerException();
return StringCoding.encode(charsetName, value, 0, value.length);
}
[java] view plain copy
static byte[] encode(String charsetName, char[] ca, int off, int len)
throws UnsupportedEncodingException
{
StringEncoder se = deref(encoder);
String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;
if ((se == null) || !(csn.equals(se.requestedCharsetName())
|| csn.equals(se.charsetName()))) {
se = null;
try {
Charset cs = lookupCharset(csn); //生成字符集实例
if (cs != null)
se = new StringEncoder(cs, csn);
} catch (IllegalCharsetNameException x) {}
if (se == null)
throw new UnsupportedEncodingException (csn);
set(encoder, se);
}
return se.encode(ca, off, len);
}
[java] view plain copy
private static Charset lookupCharset(String csn) {
if (Charset.isSupported(csn)) {
try {
return Charset.forName(csn);
} catch (UnsupportedCharsetException x) {
throw new Error(x);
}
}
return null;
}
[java] view plain copy
private StringEncoder(Charset cs, String rcn) {
this.requestedCharsetName = rcn;
this.cs = cs;
this.ce = cs.newEncoder()
.onMalformedInput(CodingErrorAction.REPLACE)
.onUnmappableCharacter(CodingErrorAction.REPLACE);
this.isTrusted = (cs.getClass().getClassLoader0() == null);
}