编码。。。。。不想再折磨下去了

soli11722984 2010-06-08 04:07:07
-61, -105, -61, -108
上面是一个中文字的字节数组,汉字是 自

可。。。。。。实在试不出是哪种的编码

来个编码达人。。。。。。帮忙给出答案
顺便给出所有中文的编码集,以备日后使用


已知有
UTF-8、UTF-16
GBK、GB2312、GB18030
USC-2、USC-4(不过JAVA好象不支持。。。。报不支持异常)
...全文
540 63 打赏 收藏 转发到动态 举报
写回复
用AI写文章
63 条回复
切换为时间正序
请发表友善的回复…
发表回复
fir567like2 2010-06-08
  • 打赏
  • 举报
回复
路过,看能不能得点分
  • 打赏
  • 举报
回复
对于简体汉字来说,由于 GB2312, GBK, GB18030 基本上是兼容的可以认为是一种编码,因此乱码无非是以下四种情况之一,后面会教各位如何进行识别(需要知道原文是什么字符的基础之上)。

1:GBK 被编码成 ISO 8859-1 了
2:UTF-8 被编码成 ISO 8859-1 了

3:GBK 被编码成 UTF-8 了
4:UTF-8 被编码成 GBK 了

前两种显示的乱码中,我们基本上一个字符都看不懂,不知道是什么,所有的字符都是低于 0xFF 的
后两种显示的乱码中,我们可以看到少量的汉字字符(可能是繁体汉字),至少有一个字符值是大于 0xFF 的

以上方法可以区分 1、2 还是 3、4。

接下来看如何区分 1 和 2:

GBK 汉字是采用两个字节编码,而 UTF-8 的汉字是至少是采用三个字节进行编码,因此通过乱码的个数可以断定是 1 还是 2。如果原文是 5 个汉字,数乱码个数如果是 10 个的话那说明是 1,如果是 15 的话那说明是 2。当然了,乱码字符有些是不可显的,数的时候可能会少掉几个,多测试几组字符就可以了。

再来看一下如何区分 3 和 4:

上面也说到了,UTF-8 汉字采用三个字节,GBK 汉字采用两个字节。UTF-8 汉字的编码长度是 GBK 汉字的 1.5 倍。如果原文是 5 个汉字,乱码的个数如果是 7 个或者 8 个的话,那说明 UTF-8 的编码被错误地编码成 GBK 了,也就是前面的第四种形式。如果原文是 5 个汉字,乱码的个数少于 5 个的话,那说明 GBK 的编码被错误地编码成 UTF-8 了,也就是前面的第三种形式。

上面的判断是在原文已知的情况下做的,如果原文未知的话,也能进行判断,但需要对编码有更深层次地了解,掌握编码的结构特性,以及在某些编码中不可能会出现的字节等等。

上面这些是我个人的经验,仅供参考。

coooliang 2010-06-08
  • 打赏
  • 举报
回复
浏览器-->查看--> 编码
里面选择UTF-8,GB2312,GBK,GB18030 总有一个可以改过来

我用163的邮箱也出现过.
  • 打赏
  • 举报
回复
呵呵,邮件中的乱码问题可能是应用开发中乱码问题最多的了,比 Web 出现乱码的几率高很多。

邮件的各个地方都会有乱码,比如:主题、正文、附件名等等。

乱码问题有时候很好判断,一般看一下是什么样的乱码,再知道应该是什么样的字符,很快就能看出来。

拿你刚才那个:hello ×Ô¶¯»Ø¸´ 来说吧,hello 和空格没啥好说的了,因为已经后面几个字符应该是“自动回复”一共是 4 个字符,数一下乱码的字符个数是 8 个,这时可以将 UTF-8 编码排除,因为 UTF-8 在编码汉字时至少需要采用 3 个字节,这 4 个字符需要 12 个字节,很明显不是。由于简体汉字除了 UTF-8 之外,就是 GB2312、GBK、GB18030 了,而且对于“自动回复”这四个一级汉字来说编码都是一样的。

将这 8 个乱码复制到下面的程序中:

public class MailTest {

public static void main(String[] args) {
String str = "×Ô¶¯»Ø¸´";
char[] chs = str.toCharArray();
for(int i = 0; i < chs.length; i++) {
System.out.println(Integer.toHexString(chs[i]));
}
}
}


输出的结果是(注意,所有的字符都低于 0xff 的,可以断定某种编码被强制拆分成 ISO 8859-1 了):

d7
d4
b6
af
bb
d8
b8
b4

拿 GBK 来测试,取最后两个字节 B8 和 B4,看一下是哪个字符:

String str = new String(new byte[]{ (byte)0xb8, (byte)0xb4 }, "gbk");
System.out.println(str);


输出的结果是个“复”字,至此乱码的猜测完成了。
xx314327475 2010-06-08
  • 打赏
  • 举报
回复
坐观 学习~
soli11722984 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 bao110908 的回复:]

标准的做法应该是从邮件头中获取 Subject 信息并将其解码还原成字符,将还原后的字符与需要添加的字符组合后,再将其编码后放到 Subject 中去。

也希望看到此帖的开发人员,在编写邮件发送程序时应遵守规范,以免引起不必要的麻烦。
[/Quote]

啊啊,原来是西欧字集,谢谢火龙果了,4个乱码标题好了一个,后面还有的都是纯乱码,也没看到相关mime的踪影
而且正文部分还没想好怎么处理。。。。。。希望不要太多这么混合体,要乱就全乱,要不就标准,哎
  • 打赏
  • 举报
回复
标准的做法应该是从邮件头中获取 Subject 信息并将其解码还原成字符,将还原后的字符与需要添加的字符组合后,再将其编码后放到 Subject 中去。

也希望看到此帖的开发人员,在编写邮件发送程序时应遵守规范,以免引起不必要的麻烦。
  • 打赏
  • 举报
回复
很多程序员在编写发送邮件程序时都不按照标准来走,直接将字符写入 Subject!

很明显写这个自动回复程序的程序员就是这样,接收到邮件时取出 Subject 直接与需要在前面添加的字符进行组合,就形成了这样混合的 Subject 了。
  • 打赏
  • 举报
回复
不好意思,我前面看错了,没看到你在 50 楼的回复。

弄到最后算是整明白了!

import java.io.UnsupportedEncodingException;

import javax.mail.internet.MimeUtility;

public class MailTest {

public static void main(String[] args) throws UnsupportedEncodingException {
String[] strs = {
"hello ×Ô¶¯»Ø¸´:=?gbk?B?1eLA79bQzsTP1Mq+1f2zow==?=",
"hello ×Ô¶¯»Ø¸´:",
"=?gbk?B?1eLA79bQzsTP1Mq+1f2zow==?=" };
for(int i = 0; i < strs.length; i++) {
System.out.println(getSubject(strs[i]));
}
}

public static String getSubject(String headerSubject)
throws UnsupportedEncodingException {
if(headerSubject == null) {
return null;
}
int start = headerSubject.indexOf("=?");
if(start < 0) {
return new String(headerSubject.getBytes("iso8859-1"), "gbk");
}
if(start == 0) {
return MimeUtility.decodeText(headerSubject);
}
String mixed = headerSubject.substring(0, start);
String subject = new String(mixed.getBytes("iso8859-1"), "gbk");
return subject + MimeUtility.decodeText(headerSubject.substring(start));
}
}
soli11722984 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 bao110908 的回复:]

引用 49 楼 soli11722984 的回复:
=?gbk?B?1eLA79bQzsTP1Mq+1f2zow==?=这里的翻译是“这里中文显示正常”,至于自动回复就是“subject:hr_zhao_pin ×Ô¶¯»Ø¸´”


很明显红色字的内容肯定不是“自动回复”,里面至少有“hr_zhao_pin”字符。

我也受不了这种挤牙膏式的回复,这个帖子就关注到这里了。
[/Quote]

哎.....50楼不是说了吗,写错了
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 soli11722984 的回复:]
=?gbk?B?1eLA79bQzsTP1Mq+1f2zow==?=这里的翻译是“这里中文显示正常”,至于自动回复就是“subject:hr_zhao_pin ×Ô¶¯»Ø¸´
[/Quote]

很明显红色字的内容肯定不是“自动回复”,里面至少有“hr_zhao_pin”字符。

我也受不了这种挤牙膏式的回复,这个帖子就关注到这里了。
zihuzihuzihu 2010-06-08
  • 打赏
  • 举报
回复
luiganqian 2010-06-08
  • 打赏
  • 举报
回复
额~~~~~~~~~~~
soli11722984 2010-06-08
  • 打赏
  • 举报
回复
×Ô¶¯»Ø¸´这才是自动回复。。。。。。上面写错了
soli11722984 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 bao110908 的回复:]

引用 37 楼 soli11722984 的回复:

那标题类似以下样子

hello [中间是乱码字]:这里中文显示正常

mime定义成了

hello ×Ô¶¯»Ø¸´:
=?gbk?B?[后面中文的base64编码]==?=


我说了你不会问题,最关键的部分竟然用“[后面中文的base64编码]”!

=?gbk?B?[后面中文的base64编码]==?=……
[/Quote]

那个。。。。理解错了

System.out.println("subject:"+message.getHeader("subject")[0]);
输出
subject:hello ×Ô¶¯»Ø¸´:
=?gbk?B?1eLA79bQzsTP1Mq+1f2zow==?=

System.out.println("subject:"+MimeUtility.decodeText(message.getHeader("subject")[0]));//一样是乱码


后面那堆编码只是把":"号后面的中文进行编码了,而":"后面的我这也能正常显示中文,现在问题是":"前面的,传过来就不是mime定义的编码,已经是乱码的中文字了

=?gbk?B?1eLA79bQzsTP1Mq+1f2zow==?=这里的翻译是“这里中文显示正常”,至于自动回复就是“subject:hr_zhao_pin ×Ô¶¯»Ø¸´”
jbz001 2010-06-08
  • 打赏
  • 举报
回复
同样不懂
aa870816 2010-06-08
  • 打赏
  • 举报
回复
期待高手出现!!!!
kao331431214 2010-06-08
  • 打赏
  • 举报
回复
mark
smi_ling 2010-06-08
  • 打赏
  • 举报
回复
学习!!
Headsen 2010-06-08
  • 打赏
  • 举报
回复
火龙果真认真!榜样啊!值得学习!
加载更多回复(43)

62,615

社区成员

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

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