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

相关文章

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061