Java 将DOM元素编码从CP1251转换为UTF-8
我有一个简单的服务器端代码,它接受请求xml并将其作为字符串插入Oracle数据库Clob列。问题是客户端发送带有CP1251编码文本的请求xml,但我需要使用UTF-8编码将其插入Oracle。 现在我用于CP1251的代码是: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 = (
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序列化为字符串。