关于Unihan Database汉字解码问题,一个汉字对应三个编码,如何利用编码反编码汉字回来呢?

EchoChina 2004-07-13 10:56:21
关于Unihan Database汉字解码问题,一个汉字对应三个编码,如何利用编码反编码汉字回来呢?

也就是Unicode转GB2312的算法吗?

在这个地址
http://www.unicode.org/charts/unihan.html
我们输入:汉字解码问题,然后Lookup
提交时在地址栏里已经出现:
http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=%E6%B1%89%E5%AD%97%E8%A7%A3%E7%A0%81%E9%97%AE%E9%A2%98
结果是:
Unihan data for U+%E6%B1%89%E5%AD%97%E8%A7%A3%E7%A0%81%E9%97%AE%E9%A2%98
也就是一个汉字对应三个编码!

如果我现在得到的编码过的数据:%E6%B1%89%E5%AD%97%E8%A7%A3%E7%A0%81%E9%97%AE%E9%A2%98

如何才能反编码为:汉字解码问题,这六个字回来呢?
...全文
2279 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuai002 2005-08-02
  • 打赏
  • 举报
回复
真是好贴啊
hnzjl 2005-08-02
  • 打赏
  • 举报
回复
我刚学java,这是我以前用C#写的转换程序
//将Utf-8转换为GB2312
public static string GetGB2312(string uValue)
{
string strSpecial="%21,%22,%22,%23,%24,%25,%26,%27,%28,%29,%2a,%2b,%2c,%2f,%3a,%3b,%3c,%3d,%3e,%3f,%40,%5b,%5c,%5d,%5e,%60,%7b,%7c,%7d,%7e,%25";
string flag="";
string back="";
string front="";
string[] split=uValue.Replace("+"," ").Split(new Char[] {'%'});
string gbValue=split[0];
for(int i=1;i<split.Length;i++)
{
if(split[i].Length<2)
{
gbValue+=split[i];
}
else
{
flag="%"+split[i];
if(strSpecial.IndexOf(flag)!=-1)
{
gbValue+=(char)int.Parse(split[i], System.Globalization.NumberStyles.HexNumber);
}
else
{
front=split[i+2];
back="";
if(split[i+2].Length>2)
{
front=split[i+2].Substring(0,2);
back=split[i+2].Substring(2,split[i+2].Length-2);
}
gbValue=gbValue+GetToGB(split[i],split[i+1],front)+back;
i+=2;
}
}
}
return gbValue;
}
EchoChina 2005-07-04
  • 打赏
  • 举报
回复
大家等待IBM修复BUG的消息发放吧(*_*)
MARS.nEIL 2005-05-14
  • 打赏
  • 举报
回复
System.out.println(new String(testStr.getBytes("utf-8"),"utf-8"));//13 ??
我在这一句,也输出了中文
dzeng81 2005-05-14
  • 打赏
  • 举报
回复
哈,没想到家都存在这个问题啊!
EchoChina 2004-12-31
  • 打赏
  • 举报
回复
此题看来无解了,只能用偷鸡的办法来解决了。测试过,可行:)
Lfrazy 2004-09-29
  • 打赏
  • 举报
回复
mark
YuLimin 2004-08-25
  • 打赏
  • 举报
回复
请看看这里

http://www.echochina.net/Love.htm
YuLimin 2004-08-25
  • 打赏
  • 举报
回复
Lotus R7 B2也是一样的糟糕,奇数个汉字还是不行!
binzh 2004-08-23
  • 打赏
  • 举报
回复
EchoChina (EchoChina) = YuLimin(阿敏总司令)

參考: http://www.echochina.net/123/Resume.htm
miaoliujun 2004-08-22
  • 打赏
  • 举报
回复
to:"关于把??恢复成汉字的问题值得深入讨论"
如果string已经是??了那么再恢复为汉字就几乎不可能了,因为可能字节已经失真了(被截取),如果??只是转换过程中的一个显示,那么还是可以转换的。只要把握转换的规则,应该不是什么难的问题,转换最为复杂的就是奇数个汉字由utf-8转为gbk了,但上面已经解决了这个问题。
to:“还有网页中察看源文件没有汉字都是&23434;&23439之类的东西显示成汉字的事谁能解释一下啊?”
那是网页response的时候就是给你的这个数据(&23434;&23439之类的东西),但我们的操作系统(也许是浏览器)会自动转换的。你不信,以这些数据命名一个文件,然后点击该文件,在左侧的文件描述里,文件名已经是中文了:),当然这是在windows底下的测试,其他操作系统没有做过类似测试。比如:征服.MP3,你看一下左侧的显示肯定是:征服.MP3
miaoliujun 2004-08-19
  • 打赏
  • 举报
回复
给大家一个测试的例子:
class test {
public test() {
}
public static void main(String[] args) {
try{
String testStr="中文话";
System.out.println(testStr.length());
System.out.println(testStr);//1 中文
System.out.println(testStr.getBytes());//2 [B@ad3ba4
System.out.println(testStr.getBytes("GB2312"));//3 [B@5483cd
System.out.println(testStr.getBytes("utf-8"));//4 [B@19ee1ac

System.out.println(new String(testStr.getBytes()));//5 中文
System.out.println(new String(testStr.getBytes(),"GB2312"));//6 中文
System.out.println(new String(testStr.getBytes(),"utf-8"));//7 ????
System.out.println(new String(testStr.getBytes("GB2312")));//8 中文
System.out.println(new String(testStr.getBytes("GB2312"),"GB2312"));//9 中文
System.out.println(new String(testStr.getBytes("GB2312"),"utf-8"));//10 ????


System.out.println(new String(testStr.getBytes("utf-8")));//11 ??
System.out.println(new String(testStr.getBytes("utf-8"),"GB2312"));//12 ??
System.out.println(new String(testStr.getBytes("utf-8"),"utf-8"));//13 ??
System.out.println();
String a[]=new String[10];
System.out.println("result:"+new String(new String(testStr.getBytes(),"ISO8859_1").getBytes("ISO8859_1"),"GBK"));
/*
a[0]="GBK";
a[1]="GB2312";
a[2]="UTF8";
a[3]="ISO8859_1";
//a[3]=;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
System.out.println(i+","+j+":"+new String( (new String(testStr.getBytes("utf-8"))).
getBytes(a[i]), a[j]));
}
System.out.println(i+","+4+":"+new String( (new String(testStr.getBytes("utf-8"))).
getBytes(a[i])));
}
for(int j=0;j<4;j++){
System.out.println(4+","+j+":"+new String( (new String(testStr.getBytes("utf-8"))).
getBytes(), a[j]));
}
System.out.println(4+","+4+":"+new String( (new String(testStr.getBytes("utf-8"))).
getBytes()));
System.out.println();
System.out.println();
System.out.println();
System.out.println(tranceCN.convertUTF8String2Unicode(testStr));
*/
}catch(Exception e){
e.printStackTrace();
}
}
}
miaoliujun 2004-08-19
  • 打赏
  • 举报
回复
还是我来个经典的答案吧,也是我以前遇到后解决的,希望对大家有帮助:
String testStr="中文话";
System.out.println("result:"+new String(new String(testStr.getBytes(),"ISO8859_1").getBytes("ISO8859_1"),"GBK"));
这样就可以了。
事实上,从3个汉字从utf-8直接转到gbk是不行的,但这个例子就是利用java默认字符集是utf-8,先将utf-8转为iso8859-1,然后再将iso8859-1转化为GBK。这样就达到了大家意想不到的效果。
如果你还调试不成功,请告诉我。
张海霖 2004-08-14
  • 打赏
  • 举报
回复
还有网页中察看源文件没有汉字都是&23434;&23439之类的东西显示成汉字的事谁能解释一下啊?
还有网页中察看源文件没有汉字都是&23434;&23439之类的东西显示成汉字的事谁能解释一下啊?
还有网页中察看源文件没有汉字都是&23434;&23439之类的东西显示成汉字的事谁能解释一下啊?
张海霖 2004-08-14
  • 打赏
  • 举报
回复
关于把??恢复成汉字的问题值得深入讨论
osobo 2004-08-09
  • 打赏
  • 举报
回复
哎,vtf_8.不了解
Dynamic 2004-08-08
  • 打赏
  • 举报
回复
System.out.println(new java.net.URLDecoder().decode(s,"UTF-8"));
改为:
System.out.println(java.net.URLDecoder.decode(s,"UTF-8"));
更恰当...
EchoChina 2004-08-01
  • 打赏
  • 举报
回复
其实有个偷鸡的办法就是把得到的名字信息拿到Names.nsf里面去对比一下,对比到最合适者的应当就是了。

不过。。。哈哈哈。。。只能这样了。。。
EchoChina 2004-08-01
  • 打赏
  • 举报
回复
呵呵。。。
只能说你不懂或者说在Domino上面做的开发太少了。。。

你可以做个Servlet在Domino上面运行一下,R5跟R6也是不同的哦:)
然后加一下以下打印用户信息的代码,要先登录。
也就是说request.getRemoteUser();返回的用户已经有问题了,所以应当打IBM的屁股,而不是我们。
至于你说的那些,大家都受教育了,哈哈哈。。。

ServletOutputStream servletoutputstream = response.getOutputStream();
String strFullName = request.getRemoteUser();
System.out.println("strFullName" + strFullName);
servletoutputstream.println("request.getRemoteUser():" + strFullName + "<p>");
try
{
byte[] b;
int i;
for(i = 0;i < strFullName.length();i++)
{
System.out.println(i + ":" + strFullName.substring(i,i + 1));
}
b = strFullName.getBytes();
for(i = 0;i < b.length;i++)
{
System.out.println(i + ":" + b[i]);
}
for(i = 0;i < b.length;i++)
{
//System.out.println(i + ":" + b[i]);
System.out.println(i + ":%" + (char)(b[i]));
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
hanyongjian 2004-08-01
  • 打赏
  • 举报
回复
关于%89%2F变成%3F原因:当使用System.out.print()方法输出GBK格式的%89%2F时,由于系统无法解释%89%2F为一个对应的汉字,所以它输出了一个?号。而?号的编码就是%3F。所以从Java控制台上读取到的字符编码就变为了%3F。但在内存里还是以%89%2F的方式保存。

在前面的代码中:
String gbkResult = new String(bytes, "GBK");
System.out.print(gbkResult);

以上代码可以看到Java控制台上打印出来的是"CN=姹夊瓧涓?O=EchoChina"。以下测试也能通过:

assertEquals("CN=姹夊瓧涓" + new String(new byte[]{(byte)0X89, (byte)0X2F}) + "O=EchoChina", gbkResult);
assertFalse("CN=姹夊瓧涓?O=EchoChina".equals(gbkResult));

我想说明的是%89%2F根本就没有变成%3F!自己的眼睛欺骗了自己。

《人件集》中说过当软件开发中出现了bug,那就说明软件过程中也存在着bug。是到了应该改进的时候。
加载更多回复(37)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧