关于字符编码问题

今天被一个哥们问住了:当文件中有ASCII编码和ANSI编码混排的时候,如何区分.
经过查找资料,结果如下:
 
中文总体上来说有ANSI编码和UNICODE编码
ANSI称之为地区编码,UNICODE是国际编码
ANSI往往是某个国家为自己的语言所创立的,比如GB2312,GBK,BIG5等
UNICODE用来涵盖世界上所有的字符,简单的说就是全球用同一套编码格式.
 
ASCII采用00~7F之间的编码,而ANSI则采用80~FF的两字节表示一个字符,UNICODE文章的开头会以FF FE开头来标识.
 
"123好"的ANSI编码就是"123"以ASCII编码保存而'好'以ANSI保存.
ANSI编码的类型是当字在ASCII表中的时候,就以ASCII保存,如果不在,则以两位80-FF之间的编码保存.
 
范例:
123好
ASCII:31 32 33 3F (转换时溢出)
ANSI:31 32 33 BA C3
UNICODE:FF FE 31 00 32 00 33 00 7D 59
 
31 32 33 BA C3  没有以FF FE开头,故不是UNICODE
0< 31,32,33 <7F --ANSI
80< BA,C3 <FF --两字节组成一个ANSI
 
后来又简单的看了一下半角和全角的问题,其实就是对于ASCII码表中存在的字符是以ASCII码保存(半角)还是以ANSI码保存(全角)的不同而已.
 
 
测试程序如下(IDE默认编码:GBK):
import  java.io.UnsupportedEncodingException;

/**
 * 
@author skylovers
 * 
 
*/

public   class  CodeTest  {
    
private static String byte2Hex(byte b) {
        String str 
= "";
        
int i = b;
        
if(i<0){
            i
=b+256;
        }

        
char[] chars = new char[] '0''1''2''3''4''5''6''7',
                
'8''9''A''B''C''D''E''F' }
;
        
int poit = i / 16;
        str 
+= chars[poit];
        poit 
= i % 16;
        str 
+= chars[poit];
        
return str;
    }


    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {

        String str 
= "123好";
        
byte[] code = str.getBytes();
        
for (byte b : code)
            System.out.print(byte2Hex(b) 
+ " ");
        System.out.println();
        
try {
            code 
= str.getBytes("unicode");
        }
 catch (UnsupportedEncodingException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

        
for (byte b : code)
            System.out.print(byte2Hex(b) 
+ " ");
        System.out.println();
        
try {
            code 
= str.getBytes("ascii");
        }
 catch (UnsupportedEncodingException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

        
for (byte b : code)
            System.out.print(byte2Hex(b) 
+ " ");
        System.out.println();
        System.out.println(
new String(code));
        
    }


}



 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值