Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将DOM元素编码从CP1251转换为UTF-8_Java_Xml - Fatal编程技术网

Java 将DOM元素编码从CP1251转换为UTF-8

Java 将DOM元素编码从CP1251转换为UTF-8,java,xml,Java,Xml,我有一个简单的服务器端代码,它接受请求xml并将其作为字符串插入Oracle数据库Clob列。问题是客户端发送带有CP1251编码文本的请求xml,但我需要使用UTF-8编码将其插入Oracle。 现在我用于CP1251的代码是: Element soapinElement = (Element) streams.getSoapin().getValue().getAny(); //retrieve request xml Node node = (

我有一个简单的服务器端代码,它接受请求xml并将其作为字符串插入Oracle数据库Clob列。问题是客户端发送带有CP1251编码文本的请求xml,但我需要使用UTF-8编码将其插入Oracle。 现在我用于CP1251的代码是:

        Element soapinElement = (Element) streams.getSoapin().getValue().getAny();  //retrieve request xml      
        Node node = (Node) soapinElement;
        Document document = node.getOwnerDocument();
        DOMImplementationLS domImplLS = (DOMImplementationLS) document.getImplementation();         
        LSSerializer serializer = domImplLS.createLSSerializer();
        LSOutput output = domImplLS.createLSOutput();
        output.setEncoding("CP1251");
        Writer stringWriter = new StringWriter();
        output.setCharacterStream(stringWriter);
        serializer.write(document, output);
        String soapinString = stringWriter.toString();
此代码识别CP1251中编码的文本。 这项任务是使用UTF-8编码的可读文本进行相同的操作。请提出任何意见

我试过这个,但它产生了不可读的字符,而不是西里尔文:

        Element soapinElement = (Element)   streams.getSoapin().getValue().getAny();            
        Node node = (Node) soapinElement;
        Document document = node.getOwnerDocument();
        DOMImplementationLS domImplLS = (DOMImplementationLS) document.getImplementation();         
        LSSerializer serializer = domImplLS.createLSSerializer();
        LSOutput output = domImplLS.createLSOutput();
        output.setEncoding("CP1251");
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        output.setByteStream(byteArrayOutputStream);
        serializer.write(document, output);
        byte[] result = byteArrayOutputStream.toByteArray();
        InputStream is = new ByteArrayInputStream(result);
        Reader reader = new InputStreamReader(is, "CP1251");
        OutputStream out = new ByteArrayOutputStream();
        Writer writer = new OutputStreamWriter(out, "UTF-8");
        char[] buffer = new char[10];
        int read;
        while ((read = reader.read(buffer)) != -1) {
            writer.write(buffer, 0, read);
        }           
        reader.close();
        writer.close();
        String soapinString = out.toString();

您可以解码CP1251字符集数据,如下所示

Charset utf8charset = Charset.forName("UTF-8");
Charset cp1251charset = Charset.forName("CP1251");

// decode CP1251
        CharBuffer data = cp1251charset.decode(ByteBuffer.wrap(result));
并编码为UTF-8字符集

// encode UTF-8
        ByteBuffer outputBuffer = utf8charset.encode(data);
并将ByteBuffer转换为byte[]

// UTF-8 Value        
        byte[] outputData = outputBuffer.array();

这可能会解决您的问题。

我不理解您的问题。字符串没有任何编码。编码仅在将字符串转换为字节时使用(反之亦然)。因此,如果您的数据库列是varchar,并且配置为使用UTF8,那么将字符串存储到该列中将以UTF8对其进行编码,无论原始XML文件的编码是什么。@jbniset
output.setEncoding(“CP1251”)
生成一个标题
,我不喜欢它。它应该是
如果希望它是UTF-8,为什么要将编码设置为CP1251?@JBNizet,因为如果我设置了
output.setEncoding(“UTF-8”)然后我会得到
ÐÐÐ。ÐÐÐÐÐ
插入到Oracle中,其中包含不可读字符,最初是西里尔字符集。这是因为客户端将其编码为CP1251.No。这可能是因为您的Oracle数据库没有配置为将字符串存储为UTF-8。正如我所说,字符串没有任何编码。您正在将XML序列化为字符串。