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

相关文章

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推