如何查看字符编码类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何查看字符编码类型相关的知识,希望对你有一定的参考价值。

可以通过以下方法来进行编码格式判断,输入一个字符串,之后返回字符串编码类型。
public static String getEncoding(String str)
String encode = "GB2312";
try
if (str.equals(new String(str.getBytes(encode), encode))) //判断是不是GB2312
String s = encode;
return s; //是的话,返回“GB2312“,以下代码同理

catch (Exception exception)

encode = "ISO-8859-1";
try
if (str.equals(new String(str.getBytes(encode), encode))) //判断是不是ISO-8859-1
String s1 = encode;
return s1;

catch (Exception exception1)

encode = "UTF-8";
try
if (str.equals(new String(str.getBytes(encode), encode))) //判断是不是UTF-8
String s2 = encode;
return s2;

catch (Exception exception2)

encode = "GBK";
try
if (str.equals(new String(str.getBytes(encode), encode))) //判断是不是GBK
String s3 = encode;
return s3;

catch (Exception exception3)

return ""; //如果都不是,说明输入的内容不属于常见的编码格式。
参考技术A 分不同的类型,可按以下三种方式查询:
一、查看mysql数据库服务器和数据库MySQL字符集。
命令:

mysql> show variables like '%char%';

二、查看MySQL数据表(table)的MySQL字符集。
命令:
mysql> show table status from sqlstudy_db like '%countries%';

三、查看MySQL数据列(column)的MySQL字符集。
命令:

mysql> show full columns from countries;

通过查看编码映射表确定编码类型

如何判断字符串是由何种编码编写的呢?最简单粗暴的方法是靠字节个数来判断,直接上代码:

# _*_coding:utf-8_*_

s = 编程

s1 = s.decode(utf-8)  # 将s抓换成换成unicode编码
s2 = s1.encode(utf-8)  # 将s1从unicode转换成utf-8
s3 = s1.encode(gbk)  # 将s2从unicode换换成gbk

print(s2, s3, s1)  # (‘xe7xbcx96xe7xa8x8b‘, ‘xb1xe0xb3xcc‘, u‘u7f16u7a0b‘)

需要注意的事s1,s2,s3放在一起就会打印出16进制字节,这是内置方法。第一个占3个字节可以推断出是utf-8,第二个占2字节可以推断出是gbk。第三个可以在unicode映射表中直接查出来。其中u代表unicode,每2个代表1个字节。

编,7f16

技术分享图片

程,7a0b

技术分享图片

 

编程对应的gbk编码是xb1xe0xb3xcc,但是和7f16,7a0b对不上,把他们转成二进制并把开头的1去掉(从高字节变成低字节)得到3160和334c。

# 编 7f16(unicode的值)  G0-3160(gbk的值)
# xb1xe0  1和0对上了 

# b       1
# 1011    0001
# 把第一位变成0
# 0011    0001 -> 转换成10进制  3 1

# e       0
# 1110    0000
# # 把第一位变成0
# 0110    0000 -> 转换成10进制  6 0

# 程 7a0b  G0-334C
# xb3xcc  3和c对上了

# b       3
# 1011    0011
# # 把第一位变成0
# 0011    0011 -> 转换成10进制 33

# c       c
# 1100    1100
# # 把第一位变成0
# 0100    1100 -> 转换成10进制 4c

 

可以看到对上了。原因是GBK兼容ASCII码,1个字节是英文,2个字节是中文。那么2个字节连到一起的话,如何判断是中文还是英文呢?由于在ASCII码中,0-127是常用的,128-255是一些乱七八糟、不常用的扩展表,所以,干脆从128开始就代表中文。所以,2个字节连在一起,如果每个字节的第1位(也就是相当于128的那个2进制位)如果是1,就代表这是个中文,这个首位是128的字节被称为高字节。那为什么xb1xe0要把128所在的位去掉(把1变成0)才能与unicode的G0-3160对上呢?这只能说是unicode在映射表的表达上直接忽略了高字节,但真正映射的时候 ,肯定还是需要用高字节的。

 

技术分享图片

以上是关于如何查看字符编码类型的主要内容,如果未能解决你的问题,请参考以下文章

编码GBK的不可映射字符

如何对mysql中的字符进行编码转换

如何查看Oracle数据库的字符编码

在Linux如何让更改文件的字符编码

如何查看mysql数据库的编码字符集

通过查看编码映射表确定编码类型