`
yzz9i
  • 浏览: 222770 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Invalid byte 2 of 2-byte UTF-8 sequence. Nested exception: Invalid byte 2 of 2-b

阅读更多
在做接口解析时候出现的错误:Invalid byte 2 of 2-byte UTF-8 sequence. Nested exception: Invalid byte 2 of 2-byte UTF-8 sequence.

很明显是在读取XML文件时候出现的编码问题!
在测试过程中发现,主要原因是xml文件中声明的编码与xml文件本身保存时的编码不一致。

现在解决的办法就有几个,主要说我测试过的两个方。
如果你是直接以文件的形式读取 可以更改XML文件中的 UTF-8编码 改为 GBK或GB2312 .
还有一种可能是 你直接以URL 通过网络地址获取InputStream流形式读取 在转换成Document对象。这种方法的解决办法是先down 下来保存在本地。实现比较简单 用个OutputStream流写到你想保存的目录即可。再解析down下来的文件 其中在 SAXReader saxReader = new SAXReader();
之后Document document=sax.read(new File(file));之前 处理XML文件编码格式即可调用下面的处理方法。
方法:
/**
 * 上传文件编码判断
* */
	public static String get_charset(File file) {
		String charset = "GBK";
		byte[] first3Bytes = new byte[3];
		try {
			boolean checked = false;
			;
			BufferedInputStream bis = new BufferedInputStream(
					new FileInputStream(file));
			bis.mark(0);
			int read = bis.read(first3Bytes, 0, 3);
			if (read == -1)
				return charset;
			if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) {
				charset = "UTF-16LE";
				checked = true;
			} else if (first3Bytes[0] == (byte) 0xFE
					&& first3Bytes[1] == (byte) 0xFF) {
				charset = "UTF-16BE";
				checked = true;
			} else if (first3Bytes[0] == (byte) 0xEF
					&& first3Bytes[1] == (byte) 0xBB
					&& first3Bytes[2] == (byte) 0xBF) {
				charset = "UTF-8";
				checked = true;
			}
			bis.reset();
			if (!checked) {
				// int len = 0;
				int loc = 0;

				while ((read = bis.read()) != -1) {
					loc++;
					if (read >= 0xF0)
						break;
					if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK
						break;
					if (0xC0 <= read && read <= 0xDF) {
						read = bis.read();
						if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF)
							// (0x80
							// - 0xBF),也可能在GB编码内
							continue;
						else
							break;
					} else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小
						read = bis.read();
						if (0x80 <= read && read <= 0xBF) {
							read = bis.read();
							if (0x80 <= read && read <= 0xBF) {
								charset = "UTF-8";
								break;
							} else
								break;
						} else
							break;
					}
				}

			}

			bis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return charset;
	}



/**
*down 的简单方法 保存到本地自己指定
*/
public static void writeFile(String strUrl, String filePath, String fileName) {
		try {
			URL url = new URL(strUrl);
			InputStream is = url.openStream();
			File f = new File(filePath);
			f.mkdirs();

			OutputStream os = new FileOutputStream(filePath + fileName);

			int bytesRead = 0;
			byte[] buffer = new byte[8192];

			while ((bytesRead = is.read(buffer, 0, 8192)) != -1) {
				os.write(buffer, 0, bytesRead);
			}
		} catch (Exception e2) {
			e2.printStackTrace();
		}
	}



/**
 * 转换流编码类型方法
 * */
private static byte[] InputStreamToByte(InputStream is) throws IOException {
		ByteArrayOutputStream byteArrOut = new ByteArrayOutputStream();
		byte[] temp = new byte[1024];
		int len = 0;
		while ((len = is.read(temp, 0, 1024)) != -1) {
			byteArrOut.write(temp, 0, len);
		}
		byteArrOut.flush();
		byte[] bytes = byteArrOut.toByteArray();
		return bytes;
	}

InputStream is :可以是流inputStream对象 也可以是file路径 自己转换!

在测试类里面
就可以把下面这种方式改成下面那种 (可能你不是这种方式做到):
SAXReader sax = new SAXReader();// 获得dom4j的文档对象	
Document document=sax.read(new File(file));
Element element=document.getRootElement();
System.out.println(element.getName());

SAXReader saxReader = new SAXReader();
//下面转格式代码
[color=red]byte[] bytes = InputStreamToByte(new FileInputStream(file));
InputStream in = new ByteArrayInputStream(bytes);
InputStreamReader strInStream = new InputStreamReader(in,"GBK");[/color]
Document root = saxReader.read(strInStream);
Element element = root.getRootElement();
System.out.println(element.getName());



这样就可以正常输出了。
最重要的是 【转换流编码类型方法】比网上的一些解决办法来得简单多了!

分享到:
评论

相关推荐

    解决Invalid byte 1 of 1-byte UTF-8 sequence

    2. "xml读取异常Invalid byte 1 of 1-byte UTF-8 sequence-中文版的window下java的默认的编码为GBK.url":这个文件名暗示了解决XML文件读取异常的方法,尤其是在Windows环境下,Java默认的文件编码可能是GBK,这可能...

    netty-resolver-dns-4.1.65.Final-API文档-中英对照版.zip

    赠送jar包:netty-resolver-dns-4.1.65.Final.jar; 赠送原API文档:netty-resolver-dns-4.1.65.Final-javadoc.jar; 赠送源代码:netty-resolver-dns-4.1.65.Final-sources.jar; 赠送Maven依赖信息文件:netty-...

    centos的ntp的arm版本ntp-4.2.6p5-29.el7.centos.2.aarch64.rpm

    ntp-4.2.6p5-29.el7.centos.2.aarch64.rpm ntp-doc-4.2.6p5-29.el7.centos.2.noarch.rpm ntp-perl-4.2.6p5-29.el7.centos.2.noarch.rpm ntpdate-4.2.6p5-29.el7.centos.2.aarch64.rpm

    audience-annotations-0.5.0-API文档-中英对照版.zip

    赠送jar包:audience-annotations-0.5.0.jar; 赠送原API文档:audience-annotations-0.5.0-javadoc.jar; 赠送源代码:audience-annotations-0.5.0-sources.jar; 赠送Maven依赖信息文件:audience-annotations-...

    cvc-complex-type.2.4.d: Invalid content was found

    在XML Schema设计中,"cvc-complex-type.2.4.d: Invalid content was found" 是一个常见的错误信息,这通常意味着在解析XML文档时,遇到了不符合定义的复杂类型的内容。这个错误通常涉及到XML Schema的约束规则,即...

    invalid multibyte character sequence 870告警1

    Invalid Multibyte Character Sequence 警告解析 在编程中,特别是在嵌入式系统开发中,我们经常会遇到Invalid Multibyte Character Sequence 警告。这个警告通常来自于编译器,告知我们存在非法的多字节字符序列。...

    gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-guneabi.tar.xz

    gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-guneabi.tar.xz gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-guneabi.tar.xz gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-guneabi.tar.xz gcc-linaro-4.9.4-2017.01-x86_...

    esxi6.7安装net55-r8168-8.045a-napi.x86_64.VIB驱动步骤.docx

    2. **上传VIB到ESXi**:将下载的VIB文件通过SSH客户端或者vSphere Client上传到ESXi主机的临时目录,例如 `/tmp`。你可以使用`scp`命令通过SSH进行文件传输,或者在vSphere Client中通过“文件”菜单的“上传文件”...

    redhat-rpm-config-125-1.el8.noarch(1).rpm

    离线安装包,亲测可用

    jaxb-api-2.3.1-API文档-中文版.zip

    赠送jar包:jaxb-api-2.3.1.jar; 赠送原API文档:jaxb-api-2.3.1-javadoc.jar; 赠送源代码:jaxb-api-2.3.1-sources.jar; 赠送Maven依赖信息文件:jaxb-api-2.3.1.pom; 包含翻译后的API文档:jaxb-api-2.3.1-...

    druid-spring-boot-starter-1.2.8-API文档-中文版.zip

    赠送jar包:druid-spring-boot-starter-1.2.8.jar; 赠送原API文档:druid-spring-boot-starter-1.2.8-javadoc.jar; 赠送源代码:druid-spring-boot-starter-1.2.8-sources.jar; 赠送Maven依赖信息文件:druid-...

    EurekaLog_7.5.0.0_Enterprise

    8)....Added: Showing call stacks for 2 new types of fatal memory errors 9)....Added: EMemLeaks._ReserveOutOfMemory to control reserve size of out of memory errors (default is 50 Mb) 10)..Added: ...

    tencentcloud-sdk-java-3.1.270

    tencentcloud-sdk-java-3.1.270

    hpacucli-9.40-12.0.x86_64.rpm和 hp-health-9.40-1602.44.rhel6.x86_64.rpm

    [root@monitor ~]# hpasmcli -s 'show'Invalid Arguments Zabbix监控总结起来有两种思路:第一就是server通过agentd方式获取数据,这种方式需要定义UserParameter参数,即KEY。第二就是server通过trapper的方式获取...

    java.io.UTFDataFormatException(解决方案).md

    这种异常通常发生在尝试读取或写入字节序列时,这些序列不符合UTF-8编码规则的情况下。 UTF-8是一种广泛使用的字符编码,它可以表示Unicode标准中的所有字符。UTF-8编码是可变长度的,它以1到4个字节序列的方式表示...

    bcprov-jdk15on-1.46.jar中文文档.zip

    (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` &lt;groupId&gt;org.bouncycastle &lt;artifactId&gt;bcprov-jdk15on *** ``` # Gradle依赖: `...

    mybatis-plus-boot-starter-3.5.3.1.jar

    mybatis-plus-boot-starter.jar 各个版本下载, SpringBoot 集成 MybatisPlus jar 包下载, Mybatis-Plus(简称MP)是一个基于MyBatis的增强工具库,它简化了与数据库的交互操作并提供了一系列增强功能,使开发者...

    kernel-devel-4.18.0-193.el8.x86_64.rpm

    亲测可用

    php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法

    在利用php解析xml时提示Invalid byte 1 of 1-byte UTF-8 sequence错误了,这个问题我百度查实说是编码问题,结果我把编码处理一下果然KO了,下面我来分享一下解决办法

    aspose-cells-8.5.2-实现excel转pdf.zip

    Aspose.Cells是一款强大的Java库,专门用于处理Microsoft Excel文件,如XLS、XLSX、XLTM等格式。在8.5.2这个版本中,它提供了将Excel工作簿转换为PDF格式的功能,这对于需要在不同平台或设备上保持一致显示效果的...

Global site tag (gtag.js) - Google Analytics