transform方法的乱码问题

本文介绍了一个关于XML文件使用GBK编码时出现乱码的问题,并提供了解决方案。通过对XML文件进行读写操作时指定正确的编码格式,可以有效避免乱码现象。

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

当XML文件的文件编码以及XML文件中所定义的编码皆为GBK时

<?xml version="1.0" encoding="GBK" standalone="no"?>
<书架>
	<书 出版社="黑马">
		<书名>Java就业培训教程</书名>
		<作者>张孝祥</作者>
		<售价>39.00元</售价>
	</书>
	<书 出版社="传智播客">
		<书名>JavaScript网</书名>
		<作者>张孝祥</作者>
		<售价>28.00元</售价>
	</书>
</书架>

运行以下代码,XML 文件会出现乱码

public class Test {
	
	private static String filePath = "src/books.xml";
	public static void main(String[] args) throws Exception{
		Document doc = null;
		//1、获得文档建造器
		DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		//2、通过传入的XML文件构建代表整个XML文档的document对象
		doc = db.parse(filePath);
		//test1(doc);
		//test2(doc);
		test3(doc);
	}
//3、修改某个元素节点的主体内容(第1本书的售价  39---69)
	public static void test3(Document doc){
		try{
			//1、获得第一个书节点
			NodeList bookList = doc.getElementsByTagName("书");
			Node firstBookNode = bookList.item(0);
			//2、获得书节点的子售价节点
			//3、修改售价节点的内容
			Node saleNode = null;
			for(int i=0;i<firstBookNode.getChildNodes().getLength();i++){
				saleNode=firstBookNode.getChildNodes().item(i);
				if("售价".equals(saleNode.getNodeName())){
					saleNode.setTextContent("69.00元");
				}
			}
			//4、更新XML文档
			//4.1得到Transformer对象
			//4.2利用Transformer的transform更新文档
			Transformer transformer = TransformerFactory.newInstance().newTransformer();
			transformer.transform(new DOMSource(doc),new StreamResult("src/books.xml"));
			//将上一行代码替换为下一行代码可解决乱码问题
			//transformer.transform(new DOMSource(doc), new StreamResult(new OutputStreamWriter(new FileOutputStream("src/books.xml"),"GBK")));
			
		}catch(Exception e){
			throw new RuntimeException(e);
		}
	}
	
	
}

解决方法是将:

transformer.transform(new DOMSource(doc),new StreamResult("src/books.xml"));
代码替换为:
transformer.transform(new DOMSource(doc), new StreamResult(new OutputStreamWriter(new FileOutputStream("src/books.xml"),"GBK")));


### fiddler响应内容乱码解决方案 当使用Fiddler抓取HTTP/HTTPS流量并保存到TXT文件时,可能会遇到编码问题导致的乱码现象。以下是几种常见的解决方法: #### 方法一:通过解码按钮处理乱码 如果在查看响应体时发现中文字符显示为乱码,可以尝试点击`Response Raw`区域上方的提示按钮:“Response is encoded and may need to be decoded before inspection. Click here to transform”。这会自动对响应内容进行解码操作,从而正确显示中文字符[^3]。 #### 方法二:手动调整编码方式 有时,默认的UTF-8编码可能无法满足需求。可以通过以下步骤更改编码设置: 1. 打开Fiddler菜单栏中的“Tools”选项; 2. 进入“Options”,切换至“Encoding”标签页; 3. 将默认编码更改为适合目标系统的编码(如GBK或GB2312),以匹配服务器端的实际编码格式[^4]。 #### 方法三:编程实现自定义解码逻辑 对于特定场景下的复杂情况,比如需要批量处理多个请求或者定制化存储流程,则可以在FiddlerScript中加入额外代码来完成任务。例如,在捕获指定域名的数据流后,将其转换成字符串形式写入本地磁盘前增加一层压缩算法支持(此处假设存在zstd类型的压缩)。具体实现如下所示: ```javascript if (oSession.fullUrl.Contains("example.com")) { try{ var responseBytes = oSession.responseBodyBytes; // 判断是否存在 zstd 压缩头信息 if(oSession.oResponse["Content-Type"] === 'application/octet-stream' && oSession.oResponse.headers.ExistsAndContains("Content-Encoding", "zstd")){ // 使用第三方库加载 Zstandard 功能模块 var decompressedData = DecompressZSTD(responseBytes); var responseString = System.Text.Encoding.UTF8.GetString(decompressedData); }else{ var responseString = System.Text.Encoding.Default.GetString(responseBytes); } var filePath = "C:\\temp\\response_data.txt"; System.IO.File.WriteAllText(filePath, responseString, System.Text.Encoding.UTF8); } catch(err){ FiddlerObject.Log.LogFormat("Error processing session: {0}", err.Message); } } ``` 上述脚本片段展示了如何检测是否有特殊压缩格式以及相应解压过程,并最终按照标准文本模式输出结果[^1]。 --- ### 总结 以上三种途径分别适用于不同层次的需求范围,从简单的界面交互操作直至深入修改内部工作原理均有所涉及。根据实际应用场景选取最合适的办法即可有效应对因各种因素引起的字符集不一致所造成的视觉干扰状况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值