判断从输入流中获取的字符串是什么编码(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

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级