java文字列检查_java 检测文本、文件编码
/**
* 默认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 检测文本、文件编码相关推荐
- java显示行号_java开发文本编辑器手记之行号显示
学java编程一段时间了,想利用java swing开发一个桌面的文本编辑器程序,首先想要实现的便是显示行号的功能,由于要实现一些关键词着色功能,选择了JTextPane,其实还有一个JEditorP ...
- java文字转语音播报并输出文件
一.pom.xml引入jar包依赖 <!-- https://mvnrepository.com/artifact/com.jacob/jacob 文字转语音 --> <depend ...
- java properties读取中文_Java读取properties文件中文乱码
Java读取properties文件中文乱码 之前读取properties配置文件时候全都是英文或者数字之类的,最近项目有个需求要properties配置文件中有中文字符存在,那么读取java pro ...
- 自动检测TXT文件编码
自动检测文本文件编码的代码(只能简单判断是UTF-8或不是UTF-8),因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. String charsetDetect(String path ...
- java 文字转语音_java 实现文字转语音 -仅限windows系统
1. 下载资源jacob 将.dll文件添加到jre下的bin文件夹下 64位操作系统选择jacob-1.18-x64.dll文件 32位操作系统选择jacob-1.18-x86.dll 链接:htt ...
- java批量下载图片_Java批量写入文件和下载图片的示例代码
很久没有在WhitMe上写日记了,因为觉着在App上写私密日记的话肯定是不安全的,但是想把日记存下来.,然后看到有导出日记的功能,就把日记导出了(还好可以直接导出,不然就麻烦点).导出的是一个html ...
- java编译器代码检查_java 命名代码检查-注解处理器
命名代码检查 根据 中第6.8节的要求, Java 程序命名应当符合下列格式的书写规范: 类 ( 或接口 ) : 符合驼式命名法, 首字母大写. 方法 : 符合驼式命名法,首字母小写 字段 :类或实例 ...
- java并行计算同步返回_Java大文本并行计算实现过程解析
Java大文本并行计算实现过程解析 简单提高文本读取效率,使用BufferedReader是个不错的选择.速度最快的方法是MappedByteBuffer,但是,相比BufferedReader而言, ...
- java 导入world数据_java读取world文件,把world文件中的内容,原样输出到页面上。...
POI,处理可以.样式在Java代码中添加就可以.给了一个例子这个是Excel的.package cn.com.my.common; import java.io.File; import java. ...
- java 散列集_java数据结构之散列集HashSet与散列表Hashtable
java数据结构之散列集HashSet与散列表Hashtable 1.散列集HashSet HashSet类在java.util包中 A.构造方法:HashSet() B.常用方法 public bo ...
最新文章
- R构建对数回归模型(Logarithmic Regression)
- git push 操作代码回退
- 非主流图片编辑软件_快火拼多多直播发言软件怎么下载
- VS2008中C++打开Excel(MFC)
- 缓存DNS服务器和主从DNS服务器的快速搭建详解——续
- 验证堆表(heap table)存储方式
- Android中图片去色的两种方法
- JDK API下载
- android apk旋转,系统的屏幕旋转弱爆了!超强屏幕旋转控制APP
- 关于微信开放平台配置-网站应用
- 开发一个APP要多少钱?
- unity5(一)unity5新特性 unity下载与安装
- RESTful 架构风格概述(图文介绍)
- [Pytorch系列-35]:卷积神经网络 - 搭建LeNet-5网络与CFAR10分类数据集
- 网络编程学习笔记-套接字编程-socket
- Golang postgres.go:45:3: unknown field ‘WithReturning‘ in struct literal of type....
- qsort 函数的使用
- 国内十大活跃报表 BI 产品深度点评
- 原生js制作扫雷-自定义难度
- es 去重统计_es 去重查询(聚合、分组、分页、求和统计等)