“Invalid byte 2 of a 3-byte UTF-8 sequence”这个信息是什么意思?

19
我在 Orbeon Forms 中更改了一个文件,下次加载页面时,我收到一个错误消息,上面写着“无效的 3 字节 UTF-8 序列的第 2 字节”。请问如何解决这个问题?
9个回答

16

当Orbeon Forms读取一个XML文件并期望它使用UTF-8编码,但是该文件未正确地以UTF-8编码时,会出现此问题。要解决此问题,请确保:

  1. 您在文件开头有一个XML声明,指明该文件采用UTF-8编码:

    <?xml version="1.0" encoding="UTF-8" ?>
    
  2. 你的编辑器具备XML感知功能,因此它可以解析XML声明并因此使用UTF-8编码。如果您的编辑器不具备XML感知功能,并且您不想使用其他编辑器,则应查找一个选项或首选项,允许您指定编辑器必须使用UTF-8。


如果有人对Java和编码(以及这类错误)的更一般性讨论感兴趣,可以阅读https://dev59.com/bonca4cB1Zd3GeqP91ty。 - Giovanni

6

当您启动程序时,请使用以下Java命令行参数:

-Dfile.encoding=UTF-8

例如,
java -Dfile.encoding=UTF-8 -jar foo.jar

6

一个三字节UTF-8序列如下:

1110xxxx 10xxxxxx 10xxxxxx

你的错误信息可能意味着这三个字节中的第一个字节错误地标记了三个字节序列的开始,或者第二个字节畸形。
正如@avernet所说,你需要确保系统中的所有元素都能够生成和期望UTF-8编码。

2

我在Eclipse中遇到了同样的问题,只是尝试通过更改文件类型解决。

右键单击文件 -> 资源 -> 文本文件编码(UTF-8)

这个解决方案对我有效。

谢谢。


0
您可能需要使用以下参数配置Tomcat:

-Dfile.encoding=UTF-8


0

我正在使用Eclipse,我还必须更改文本文件编码:

->Windows->Preferences->Workspace

然后它就正常工作了。

谢谢


0
我将提供一个特殊的编码答案。当您检查xml文件时没有问题,并且您正在使用Java并运行Tomcat服务器时。您的源代码可能会忽略自己指定编码,因此JVM在将xml内容读入字符串或其他表示字符串的内容时使用默认编码,这反过来又引用了Tomcat的默认编码。如果xml和Tomcat的编码不一致,它也可能报告相同的错误消息。

0

更改输入的编码可能会有帮助:

XMLEventReader eventReader =
                            inputFactory.createXMLEventReader(in, 
                                    "utf-8"
                                    //"windows-1251"
                            );

0

遇到了同样的问题。

问题 > 我正在获取X509证书值(多个编码源)以生成PDF报告。 PDF是通过等待UTF-8 xml请求的Web服务生成的,我必须在编组之前重新编码这些值。

解决方案 > http://fabioangelini.wordpress.com/2011/08/04/converting-java-string-fromto-utf-8/

使用这个类:

public class StringHelper {

// convert from UTF-8 -> internal Java String format
public static String convertFromUTF8(String s) {
    String out = null;
    try {
        out = new String(s.getBytes("ISO-8859-1"), "UTF-8");
    } catch (java.io.UnsupportedEncodingException e) {
        return null;
    }
    return out;
}

// convert from internal Java String format -> UTF-8
public static String convertToUTF8(String s) {
    String out = null;
    try {
        out = new String(s.getBytes("UTF-8"), "ISO-8859-1");
    } catch (java.io.UnsupportedEncodingException e) {
        return null;
    }
    return out;
}
}

使用方法:

//getSummaryAttMap() returns a HashMap
String value = (String) getSummaryAttMap().get(key);
if(value != null)
value = StringHelper.convertToUTF8(value);
else
value = "";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接