判断从输入流中获取的字符串是什么编码(UTF-8环境)

2024-05-08 17:58

本文主要是介绍判断从输入流中获取的字符串是什么编码(UTF-8环境),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      当你从一个未知编码的文件中,通过输入流读取内容时,假如是乱码怎么办?

      如果你不知道字符串的编码,可能你只能靠尝试常用的编码的方式,将字符串处理成正确编码格式。

举个例子:“#鍑借喘鍚岃櫣娆惧紡f” 这是从某文件中读取的一行信息,怎么处理,一个一个去尝试么?不妨这样思考,用程序来帮忙判断其编码格式,同时将之转换成UTF-8编码怎么样。

特别说明:

      (1)以下代码仅适用于UTF-8的编译环境下,即Java文件使用UTF-8编码

      (2)代码中仅列举了常见的几种编码格式,感兴趣的话请自行增加其他编码

      (3)将一些编码格式转换成UTF-8不能成功,暂不知怎么解决,希望懂的大神不吝赐教,在此非常感谢

1、首先写一个枚举类

/*** Unicode编码枚举类* 特别注意: 仅适合编码格式为UTF-8的编译系统中* @author WolfShadow* @date 2018年11月28日*/
public enum UnicodeEnum {UTF_8("UTF-8",(byte)35 , (byte)-27 , (byte)-121),UTF_16("UTF-16",(byte)-30 , (byte)-113 , (byte)-91),GBK("GBK",(byte)35 , (byte)-23 , (byte)-115),GB2312("GB2312",(byte)35 , (byte)-17 , (byte)-65),ISO_8859_1("ISO-8859-1",(byte)35 , (byte)-61 , (byte)-91),NULL("未知编码",(byte)-1 , (byte)-1 , (byte)-1);private String encoding;//编码private byte byte1;//第1个字节private byte byte2;//第2个字节private byte byte3;//第3个字节private UnicodeEnum(String encoding, byte byte1,byte byte2, byte byte3) {this.encoding = encoding;this.byte1 = byte1;this.byte2 = byte2;this.byte3 = byte3;}public static UnicodeEnum getUnicodeEnum(byte byte1,byte byte2, byte byte3){UnicodeEnum[] values = UnicodeEnum.values();for(UnicodeEnum enum1 : values){if (enum1.getByte1()==byte1 && enum1.getByte2()==byte2 && enum1.getByte3()==byte3) {return enum1;}}return NULL;}public String getEncoding() {return encoding;}public void setEncoding(String encoding) {this.encoding = encoding;}public byte getByte1() {return byte1;}public void setByte1(byte byte1) {this.byte1 = byte1;}public byte getByte2() {return byte2;}public void setByte2(byte byte2) {this.byte2 = byte2;}public byte getByte3() {return byte3;}public void setByte3(byte byte3) {this.byte3 = byte3;}
}

2、然后增加一个工具类

/*** 字符串编码工具类* (1)检测字符串编码* (2)各种编码之间的转换(请自行完善)* (3)UTF-8、UTF-16、GBK、GB2312、ISO-8859-1等* @author WolfShadow* @date 2018年11月28日*/
public class UnicodeUtil {/*** 返回字符串的编码格式* @param str* @return* @auther WolfShadow* @date 2018年11月28日*/public static String getUnicode(String str){if (StringUtil.isEmpty(str)) {return null;}byte[] bytes = str.getBytes();UnicodeEnum unicodeEnum = UnicodeEnum.getUnicodeEnum(bytes[0], bytes[1], bytes[2]);if (unicodeEnum == null) {return null;}return unicodeEnum.getEncoding();}/*** 将字符串转换成UTF-8格式* @param str* @return* @throws UnsupportedEncodingException * @auther WolfShadow* @date 2018年11月28日*/public static String getUTF_8(String str) throws UnsupportedEncodingException{String unicode = getUnicode(str);if (unicode == null || unicode.equals(UnicodeEnum.NULL.getEncoding())) {return null;}return new String(str.getBytes(unicode),UnicodeEnum.UTF_8.getEncoding());}
}

3、写一个测试方法(或新建一个测试类)

main方法为:

public static void main(String[] args) throws UnsupportedEncodingException {String test = "#函购同虹款式f"; String str1 = new String(test.getBytes(),"UTF-8");String str2 = new String(test.getBytes(),"GBK");String str3 = new String(test.getBytes(),"ISO-8859-1");String str4 = new String(test.getBytes(),"UTF-16");String str5 = new String(test.getBytes(),"GB2312");String str6 = new String(test.getBytes(),"Unicode");System.out.println(getUnicode(str1));System.out.println(getUnicode(str2));System.out.println(getUnicode(str3));System.out.println(getUnicode(str4));System.out.println(getUnicode(str5));System.out.println(getUnicode(str6));System.out.println(getUTF_8(str6));System.out.println(getUTF_8(str5));System.out.println(getUTF_8(str4));System.out.println(getUTF_8(str3));System.out.println(getUTF_8(str2));System.out.println(getUTF_8(str1));}

4、输出结果

很明显,转换成UTF-8的方法有Bug;使用UTF-16和使用Unicode对字符串编码,结果为什么是一样的呢;有没有哪位好心的大神指点一下,谢谢咯!

 

 

 

 

这篇关于判断从输入流中获取的字符串是什么编码(UTF-8环境)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971027

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断