Ⅰ 使用java写一个utf8 到 gb2312的编码转换函数
String newStr = new String(oldStr.getBytes("utf8"), "gb2312");
不过,你是不是要自己写一个方法实现编码转换啊?
还果真是被我猜中了?你是要自己实现吗?要是真这样的话我就去帮你看看,要是不是呢,你就以后自己琢磨琢磨,:-D
你要想实现并不难,其实就是参考Java的源码,哎,这就是开源的好处啊~~
其实我想说的是,设计Java的人固然是牛,但他又不是个神人,他能实现的我们肯定也能,只是也许我们设计出来的没有他那么全面,没他考虑的那么透彻。
也许我们现在要参考源码之类的,但是等咱们吧底层的都给抓牢了,以后什么问题解决不了!
就像以前老师让咱做文件上传下载,老师说这简单,我们全笑了,因为俺们觉得难~~你猜我们那老师怎么说,笑什么呢,是很简单啊,不就一读写文件操作嘛,你们都学到这份上了,看到问题还觉得会有很大问题吗?
唉,俺们老师不知道啊,俺们看到什么都是觉得难啊,主要是俺们没底啊~~
呵呵,远了远了,见笑啦~~
Ⅱ Java怎么将字符串转换为GB2312原编码
@Test
publicvoidtest333(){
Stringa="青白";
try{
byte[]b=a.getBytes("GB2312");
System.out.println(bytesToHexFun1(b));
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}
}
//将byte数组转成16进制字符串
(byte[]bytes){
char[]HEX_CHAR={'0','1','2','3','4','5',
'6','7','8','9','a','b','c','d','e','f'};
//一个byte为8位,可用两个十六进制位标识
char[]buf=newchar[bytes.length*2];
inta=0;
intindex=0;
for(byteb:bytes){//使用除与取余进行转换
if(b<0){
a=256+b;
}else{
a=b;
}
buf[index++]=HEX_CHAR[a/16];
buf[index++]=HEX_CHAR[a%16];
}
returnnewString(buf);
}
中心思想就是先转成GB2312的byte数组,再转成16进制就可以了。
Ⅲ 应该如何彻底解决UTF8编码转换成GB2312编码问题
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
我需要将从人家网站传来的的UTF8编码携帆的字符转换成GB2312,用函数转换确实可行,但这个UTF8转GB2312编码的函数,运行起来感觉非常消耗资源,有时甚至会造成死机。
在不修改服务器设置的前提下,我应该如何解决这个问题呢?有没辩氏雹有抛核巧弃函数的转换办法,或者谁能提供一个更高效的函数?
请有过这方面的高手指点,非常感谢。
UTF8转GB2312的原函数如下(好像网上的都是这个函数):
<%
function UTF2GB(UTFStr)
for Dig=1 to len(UTFStr)
if mid(UTFStr,Dig,1)="%" then
if len(UTFStr) >= Dig+8 then
GBStr=GBStr & ConvChinese(mid(UTFStr,Dig,9))
Dig=Dig+8
else
GBStr=GBStr & mid(UTFStr,Dig,1)
end if
else
GBStr=GBStr & mid(UTFStr,Dig,1)
end if
next
UTF2GB=GBStr
end function
function ConvChinese(x)
A=split(mid(x,2),"%")
i=0
j=0
for i=0 to ubound(A)
A(i)=c16to2(A(i))
next
for i=0 to ubound(A)-1
DigS=instr(A(i),"0")
Unicode=""
for j=1 to DigS-1
if j=1 then
A(i)=right(A(i),len(A(i))-DigS)
Unicode=Unicode & A(i)
else
i=i+1
A(i)=right(A(i),len(A(i))-2)
Unicode=Unicode & A(i)
end if
next
if len(c2to16(Unicode))=4 then
ConvChinese=ConvChinese & chrw(int("&H" & c2to16(Unicode)))
else
ConvChinese=ConvChinese & chr(int("&H" & c2to16(Unicode)))
end if
next
end function
function c2to16(x)
i=1
for i=1 to len(x) step 4
c2to16=c2to16 & hex(c2to10(mid(x,i,4)))
next
end function
function c2to10(x)
c2to10=0
if x="0" then exit function
i=0
for i= 0 to len(x) -1
if mid(x,len(x)-i,1)="1" then c2to10=c2to10+2^(i)
next
end function
function c16to2(x)
i=0
for i=1 to len(trim(x))
tempstr= c10to2(cint(int("&h" & mid(x,i,1))))
do while len(tempstr)<4
tempstr="0" & tempstr
loop
c16to2=c16to2 & tempstr
next
end function
function c10to2(x)
mysign=sgn(x)
x=abs(x)
DigS=1
do
if x<2^DigS then
exit do
else
DigS=DigS+1
end if
loop
tempnum=x
i=0
for i=DigS to 1 step-1
if tempnum>=2^(i-1) then
tempnum=tempnum-2^(i-1)
c10to2=c10to2 & "1"
else
c10to2=c10to2 & "0"
end if
next
if mysign=-1 then c10to2="-" & c10to2
end function
%>
解析:
你要实现转换, 我给你写点我的经验吧. <% public String convert(String str) { String result=""; try { result=new String(str.getBytes("UTF-8"),"gb2312"); } catch (Exception ex) { System.out.println(ex.getMessage()); } return result; }%>然后在下面就可以String names=this.convert((String) ses.getAttribute("name"));进行转换了;我一般都是这样转换的.你也可以改一下.用Static方法. 搞到另一个类里面,方便调用;
Ⅳ UTF-8和GB2312互转的最简单快捷的方法
下面介绍一种UTF-8和GB2312互转的最简单快捷的方法:
一、如果你想把utf-8转为GB2312
1、用记事本打开源码,芹带把<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />换成<meta http-equiv=Content-Type content="text/html;charset=gb2312">;如闭旦果是JS不需要加这句,如果是网页最好加上这句和你页面对应的编码。
2、用记事本打开源码,另存为,编码 哪里选择 ANSI 即可。
二、如果你想把GB2312转为utf-8
1、用记事本打开源码,把<meta http-equiv=Content-Type content="text/html;charset=gb2312">换成<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />;如果是JS不需要加这句,如果是网页最好加上这句和你页面对应的编码。
2、用记事本打开源码,另存为,编码 哪里轿首扰选择 UTF-8 即可。
特别提醒:CSS的编码最好和网页的编码一致,因为有一个古老的浏览器叫IE6,他的市场占用率依然非常高,编码不一致的CSS在IE6下不起作用。
Ⅳ java中怎样将utf-8转成GB2312编码
Stringsource="测试字符串";
Stringresult=null;
try{
result=newString(source.getBytes("utf-8"),"gb2312");
}catch(){
result=source;
}
System.err.println(result);
Ⅵ 在java中,如何将utf8 十六进制编码转换成汉字
当在基于HTTP协议的JSP或Servlet的应用中获取数据或发送请求时,JVM会把输送的数据编码成UTF8格式。如果我们直接从HTTP流中提取中文数据,提取的结果为“????”(可能更多问号),为转换成我们能够理解的中文字符,我们需要把UTF8转换成GB2312,借助ISO-8859-1标准编码能够轻易的实现,下面的代码实现了这一功能:
byte [] b;
String utf8_value;
utf8_value = request.getParameter("NAME");//从HTTP流中取"NAME"的UTF8数据
b = utf8_value.getBytes("8859_1"); //中间用ISO-8859-1过渡
String name = new String(b, "GB2312"); //转换成GB2312字符
在知道流长度的情况下将输入流转换成字节数组 Java中的输入流抽象类InputStream有int read(byte[] b, int off, int len)方法,参数中byte[] b是用来存放从InputStream中读取的数据,int off指定数组b的偏移地址,也就是数组b的起始下标,int len指定需要读取的长度,方法返回实际读取的字节数。
下面的代码实现了这一功能:
ServletInputStream inStream = request.getInputStream(); //取HTTP请求流
int size = request.getContentLength(); //取HTTP请求流长度
byte[] buffer = new byte[size]; //用于缓存每次读取的数据
byte[] in_b = new byte[size]; //用于存放结果的数组
int count = 0;
int rbyte = 0;
while (count < size) {
//循环读取
rbyte = inStream.read(buffer); //每次实际读取长度存于rbyte中
for(int i=0;i<rbyte;i++) {
in_b[count + i] = buffer[i];
}
count += rbyte;
}
在不知道流长度的情况下将输入流转换成字节数组 前面介绍了已知流长度的情况下的转换方法,那么当我们不知道流有多长时,也就是说不能确定转换后的字节数组有多大时,该怎么处理呢?笔者查看了JDK文档之后发现ByteArrayOutputStream有一个byte[] toByteArray()方法,该方法会自动创建一个字节数组,然后返回。于是就巧妙的用ByteArrayOutputStream来作中间过渡实现转换,其它处理跟上面所介绍已知长度的情况差不多。假设需要被转换的流已经放在inStream里了,我们可以用如下的代码实现这一功能:
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100]; //buff用于存放循环读取的临时数据
int rc = 0;
while ((rc = inStream.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
byte[] in_b = swapStream.toByteArray(); //in_b为转换之后的结果
你试着改写成自己需要的代码
Ⅶ java utf 8转gbk
utf8和gb2312本来就是两个不同的字符集,对于中文来说,它们的编码并不会相同。如果刚开始的字符是utf8的,那么转换为gb2312后自然会是乱码;如果初始时是gb2312的中文,而后经utf8中间编码后又从utf8转为gb2312后不会是乱码的。
我想是这样的!
这有往篇文章,是关于java字符编码相关的,讲的很详细,有代码示例,你可以去看一下:http://vinter.javaeye.com/blog/670502