今天被一个哥们问住了:当文件中有ASCII编码和ANSI编码混排的时候,如何区分.
经过查找资料,结果如下:
中文总体上来说有ANSI编码和UNICODE编码
ANSI称之为地区编码,UNICODE是国际编码
ANSI往往是某个国家为自己的语言所创立的,比如GB2312,GBK,BIG5等
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之间的编码保存.
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
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
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));
}
}
/** */ /**
* @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));
}
}