String_xml报文乱码问题

本文介绍了在网络传输过程中如何处理含有中文字符的数据。主要内容包括使用URLEncoder.encode方法将中文字符串转换为ISO8859-1格式,以及如何通过指定UTF-8编码方式来确保字符串的正确传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.首先明确在网络传输中:只能传输ISO8859-1格式的编码

对于报文中有中文的,需要如下处理:

fundNameNew = URLEncoder.encode(fundName, "UTF-8");


2.将字符串强制转换成UTF-8格式:

xmlStr = new String(xmlStr.getBytes(),"UTF-8");

如果不指定格式,则采取系统默认的格式。

str.getBytes("UTF-8"); 的意思是以UTF-8的编码取得字节 
new String(XXX,"UTF-8"); 的意思是以UTF-8的编码生成字符串



### Java 解析 XML 中的 CDATA 元素或处理 XML 报文 在 Java 中解析 XML 文档时,经常会遇到需要提取 `<![CDATA[]]>` 区域的内容的情况。以下是几种常用的方法来处理 XML 中的 CDATA 元素或与 XML 相关的报文问题。 #### 方法一:使用 DOM 解析器 DOM(Document Object Model)是一种常用的 XML 解析技术,能够方便地访问和修改文档中的任何部分。当解析包含 CDATA 的 XML 时,可以通过 `getTextContent()` 方法获取节点内容,包括 CDATA 部分。 1. **代码示例** 下面展示了如何使用 DOM 解析器读取包含 CDATA 的 XML: ```java import org.w3c.dom.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; public class CdataDomParser { public static void main(String[] args) { try { File inputFile = new File("input.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(inputFile); // 可选: 使用下面这行代码规范化文档结构 document.getDocumentElement().normalize(); NodeList nodeList = document.getElementsByTagName("description"); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; System.out.println("Description Content: " + element.getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } } ``` 2. **解释** 上述程序会加载名为 `input.xml` 的文件,并查找所有的 `<description>` 标签。由于这些标签可能含有 CDATA 块,因此调用了 `getTextContent()` 方法以确保正确读取其内部文本[^2]。 --- #### 方法二:使用 SAX 解析器 SAX(Simple API for XML)采用事件驱动的方式逐行扫描整个 XML 文件。它不会一次性将整个文档载入内存,适合于大型 XML 文件的高效解析。然而,在处理 CDATA 时需要注意监听特定事件。 1. **代码示例** 这里提供了一个简单的 SAX 解析器实例: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.File; public class SaxCdataParser extends DefaultHandler { @Override public void characters(char ch[], int start, int length) throws SAXException { super.characters(ch, start, length); String content = new String(ch, start, length).trim(); if (!content.isEmpty()) { System.out.println(content); } } public static void main(String argv[]) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); SaxCdataParser handler = new SaxCdataParser(); saxParser.parse(new File("input.xml"), handler); } catch (Exception e) { e.printStackTrace(); } } } ``` 2. **说明** 此处重写了 `characters()` 方法以便捕获所有字符数据流,其中包括来自 CDATA 节点的信息。 --- #### 方法三:使用 StAX 流式解析器 StAX(Streaming API for XML)提供了更灵活的方式来遍历 XML 数据源。相比传统的 DOM/SAX 方案更加直观易懂。 1. **代码片段** 下列代码演示了如何通过 StAX 获取 CDATA 内容: ```java import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; import java.io.FileInputStream; public class StaxCdataReader { public static void main(String[] args) throws Exception { FileInputStream inputStream = new FileInputStream("input.xml"); XMLInputFactory inputFactory = XMLInputFactory.newInstance(); XMLStreamReader reader = inputFactory.createXMLStreamReader(inputStream); while (reader.hasNext()) { int event = reader.next(); switch (event) { case XMLStreamConstants.CHARACTERS: System.out.println(reader.getText()); // 打印 CDATA 或普通文本 break; } } reader.close(); } } ``` 2. **描述** 在此过程中,每当检测到 `CHARACTERS` 类型的时间发生时都会打印当前文本值,从而涵盖了 CDATA 片段内的信息[^4]。 --- #### 编码注意事项 无论选用哪种解析手段都应当留意编码设置的一致性以免引发乱码现象。例如,如果原始 XML 定义为 UTF-8 编码则必须保证后续操作也遵循相同标准[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值