/**

* 默认GB18030

*/

public static final String detectCharset(byte[] byteArray){

// 建立InputStream

ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);

// 默认编码

String utf8 = "UTF-8";

String charset = "GB18030";

// 开始检测是否为UTF-8

try {

// 标记初始位置

bais.mark(0);

// 读取前3字节

byte[] first3Bytes = new byte[3];

bais.read(first3Bytes);

// 如果前三字节为 0xEFBBBF ,则为带签名的UTF-8

if (first3Bytes[0] == (byte) 0xEF && first3Bytes[1] == (byte) 0xBB && first3Bytes[2] == (byte) 0xBF) {

return utf8;

}

// 前三字节判定失败,开始检测是否是不带签名的UTF-8

// 重置读取位置

bais.reset();

// 逐字节判定,直到遇到一个UTF-8编码字符

byte[] oneByte = new byte[1];

boolean isUtf8 = false;

while (-1 != bais.read(oneByte)) {

// 如果是ASCII码,跳过

if (CharUtils.isAscii((char) oneByte[0])) {

continue;

}

// 双字节格式

// 110yyyyy(C0-DF) 10xxxxxx

if ((oneByte[0] & 0xE0) == 0xC0) {

bais.mark(0);

byte[] nextOneByte = new byte[1];

if (bais.available() >= 1 && -1 != bais.read(nextOneByte)) {

if ((nextOneByte[0] & 0xC0) == 0x80) {

// 是GBK双字节重叠部分?暂时当GBK处理,中文系统下,GBK默认编码,UTF-8不常见

// 双字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x40到0xFE(不包括0x7F)

int oneByteInt = oneByte[0] & 0xff;

int nextOneByteInt = nextOneByte[0] & 0xff;

if (

((0x81 & 0xff) < = oneByteInt && oneByteInt <= (0xFE & 0xff))

&& ((0x40 & 0xff) <= nextOneByteInt && nextOneByteInt <= (0xfe & 0xff))

&& (nextOneByte[0] != 0x7F)

) {

continue;

}

// 非GBK重叠部分,归于UTF-8

isUtf8 = true;

break;

}

bais.reset();

}

}

// 三字节格式

// 1110xxxx(E0-EF) 10xxxxxx 10xxxxxx

if ((oneByte[0] & 0xF0) == 0xE0) {

byte[] twoByte = new byte[2];

bais.mark(0);

if (bais.available() >= 2 && -1 != bais.read(twoByte)) {

if (((twoByte[0] & 0xC0) == 0x80) && ((twoByte[1] & 0xC0) == 0x80)) {

isUtf8 = true;

break;

}

bais.reset();

}

}

// 四字节格式

// 11110www(F0-F7) 10xxxxxx 10xxxxxx 10xxxxxx

if ((oneByte[0] & 0xF8) == 0xF0) {

byte[] threeByte = new byte[3];

bais.mark(0);

if (bais.available() >= 3 && -1 != bais.read(threeByte)) {

if (((threeByte[0] & 0xC0) == 0x80) && ((threeByte[1] & 0xC0) == 0x80)

&& ((threeByte[2] & 0xC0) == 0x80)) {

isUtf8 = true;

break;

}

bais.reset();

}

}

// 五字节格式

// 111110xx(F8-FB) 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

if ((oneByte[0] & 0xFC) == 0xF8) {

byte[] fourByte = new byte[4];

bais.mark(0);

if (bais.available() >= 4 && -1 != bais.read(fourByte)) {

if (((fourByte[0] & 0xC0) == 0x80) && ((fourByte[1] & 0xC0) == 0x80)

&& ((fourByte[2] & 0xC0) == 0x80)

&& ((fourByte[3] & 0xC0) == 0x80)) {

isUtf8 = true;

break;

}

bais.reset();

}

}

// 六字节格式

// 1111110x(FC-FD) 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

if ((oneByte[0] & 0xFE) == 0xFC) {

byte[] fiveByte = new byte[5];

bais.mark(0);

if (bais.available() >= 5 && -1 != bais.read(fiveByte)) {

if (((fiveByte[0] & 0xC0) == 0x80) && ((fiveByte[1] & 0xC0) == 0x80)

&& ((fiveByte[2] & 0xC0) == 0x80)

&& ((fiveByte[3] & 0xC0) == 0x80)

&& ((fiveByte[4] & 0xC0) == 0x80)) {

isUtf8 = true;

break;

}

bais.reset();

}

}

}

// 依据标志位设定返回值

if (isUtf8) {

return utf8;

}

} catch (IOException e) {

}

// 返回字符编码格式

return charset;

}

java文字列检查_java 检测文本、文件编码相关推荐

  1. java显示行号_java开发文本编辑器手记之行号显示

    学java编程一段时间了,想利用java swing开发一个桌面的文本编辑器程序,首先想要实现的便是显示行号的功能,由于要实现一些关键词着色功能,选择了JTextPane,其实还有一个JEditorP ...

  2. java文字转语音播报并输出文件

    一.pom.xml引入jar包依赖 <!-- https://mvnrepository.com/artifact/com.jacob/jacob 文字转语音 --> <depend ...

  3. java properties读取中文_Java读取properties文件中文乱码

    Java读取properties文件中文乱码 之前读取properties配置文件时候全都是英文或者数字之类的,最近项目有个需求要properties配置文件中有中文字符存在,那么读取java pro ...

  4. 自动检测TXT文件编码

    自动检测文本文件编码的代码(只能简单判断是UTF-8或不是UTF-8),因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. String charsetDetect(String path ...

  5. java 文字转语音_java 实现文字转语音 -仅限windows系统

    1. 下载资源jacob 将.dll文件添加到jre下的bin文件夹下 64位操作系统选择jacob-1.18-x64.dll文件 32位操作系统选择jacob-1.18-x86.dll 链接:htt ...

  6. java批量下载图片_Java批量写入文件和下载图片的示例代码

    很久没有在WhitMe上写日记了,因为觉着在App上写私密日记的话肯定是不安全的,但是想把日记存下来.,然后看到有导出日记的功能,就把日记导出了(还好可以直接导出,不然就麻烦点).导出的是一个html ...

  7. java编译器代码检查_java 命名代码检查-注解处理器

    命名代码检查 根据 中第6.8节的要求, Java 程序命名应当符合下列格式的书写规范: 类 ( 或接口 ) : 符合驼式命名法, 首字母大写. 方法 : 符合驼式命名法,首字母小写 字段 :类或实例 ...

  8. java并行计算同步返回_Java大文本并行计算实现过程解析

    Java大文本并行计算实现过程解析 简单提高文本读取效率,使用BufferedReader是个不错的选择.速度最快的方法是MappedByteBuffer,但是,相比BufferedReader而言, ...

  9. java 导入world数据_java读取world文件,把world文件中的内容,原样输出到页面上。...

    POI,处理可以.样式在Java代码中添加就可以.给了一个例子这个是Excel的.package cn.com.my.common; import java.io.File; import java. ...

  10. java 散列集_java数据结构之散列集HashSet与散列表Hashtable

    java数据结构之散列集HashSet与散列表Hashtable 1.散列集HashSet HashSet类在java.util包中 A.构造方法:HashSet() B.常用方法 public bo ...

最新文章

  1. R构建对数回归模型(Logarithmic Regression)
  2. git push 操作代码回退
  3. 非主流图片编辑软件_快火拼多多直播发言软件怎么下载
  4. VS2008中C++打开Excel(MFC)
  5. 缓存DNS服务器和主从DNS服务器的快速搭建详解——续
  6. 验证堆表(heap table)存储方式
  7. Android中图片去色的两种方法
  8. JDK API下载
  9. android apk旋转,系统的屏幕旋转弱爆了!超强屏幕旋转控制APP
  10. 关于微信开放平台配置-网站应用
  11. 开发一个APP要多少钱?
  12. unity5(一)unity5新特性 unity下载与安装
  13. RESTful 架构风格概述(图文介绍)
  14. [Pytorch系列-35]:卷积神经网络 - 搭建LeNet-5网络与CFAR10分类数据集
  15. 网络编程学习笔记-套接字编程-socket
  16. Golang postgres.go:45:3: unknown field ‘WithReturning‘ in struct literal of type....
  17. qsort 函数的使用
  18. 国内十大活跃报表 BI 产品深度点评
  19. 原生js制作扫雷-自定义难度
  20. es 去重统计_es 去重查询(聚合、分组、分页、求和统计等)

热门文章

  1. 程序员转行有哪些方向?人到中年,不能当一辈子普通程序员吧!
  2. 教你更划算的选择苹果最新产品Mac Studio
  3. react 实现图片的滚动缩放和按住鼠标左键移动图片效果
  4. 程序设计基础之C语言计算职工工资
  5. C#调用触摸屏小键盘
  6. 如何通过知识付费盈利,实现内容变现?
  7. Hackthebox:Devel Walkthrough
  8. 彻底理解原型对象与原型链机制
  9. vrp java_HCIA-VRP基础及操作
  10. 64位系统可以装python32位吗_Python - pyinstaller在64位系统下打包32位程序