csv文件导出,excel打开乱码处理

原因如下有两种处理办法:

在做一个导出CSV文件的功能时发现导出的文件是乱码,上网查了下,发现原来是BOM(Byte Order Mark)的问题


  BOM是UTF编码方案里用于标识编码的标准标记,在UTF-16里是FF FE,UTF-8里是EF BB BF。这个标记是可选的,因为UTF-8没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软做这种检测,但有些软件不做这种检测,而把它当做正常字符处理。


  微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记,类Unix系统中就没有使用 BOM,因为它会破坏现有的 ASCII 文件的语法约定。

  也就是说一个UTF-8文件可能有BOM,也可能没有BOM,那么怎么区分呢?三种方法。1,用UltraEdit-32打开文件,切换到十六进制编辑模式,察看文件头部是否有EF BB BF。2,用Dreamweaver打开,察看页面属性,看“包括Unicode签名BOM”前面是否有个勾。3,用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。


  所谓的unicode保存的文件实际上是utf-16,只不过恰好跟unicode的码相同而已,但在概念上unicode与 utf是两回事,unicode是内存编码表示方案,而utf是如何保存和传输unicode的方案。utf-16还分高位在前 (LE)和高位在后(BE)两种。官方的utf编码还有utf-32,也分LE和BE。非unicode官方的utf编码还有utf-7,主要用于邮件传输。utf-8的单字节部分是和iso-8859-1兼容的,这主要是为了解决一些旧的系统和库函数不能正确处理utf-16的问题,而且对英语字符来说,也节省保存的文件空间(以非英语字符浪费空间为代价)。在iso-8859-1的时候,utf8和iso-8859-1都是用一个字节表示的,当表示其它字符的时候,utf-8会使用两个或三个字节。

 

第一种比较复杂点,进行转码UTF-16并添加BOM标识信息如下:

文件下载处理:
			// 文件名
			fileName = java.net.URLEncoder.encode(fileName, "UTF-8")
					.replaceAll("\\+", "%20");
			// 
			response.setContentType("application/octet-stream");
			String temp = "attachment;filename=\"" + fileName + "\"";
			response.setHeader("Content-disposition", temp);
			osDownload = new BufferedOutputStream(response.getOutputStream());

			// 出力数据转换为带BOM的16LE编码
			byte[] BOM_UTF16 = new byte[] { (byte) 0xFF, (byte) 0xFE };
			//context 文件内容:String
			byte[] contentByte = context.getBytes("UTF-16LE");
			byte[] allData = new byte[BOM_UTF16.length + contentByte.length];
			System.arraycopy(BOM_UTF16, 0, allData, 0, BOM_UTF16.length);
			System.arraycopy(contentByte, 0, allData, BOM_UTF16.length,
					contentByte.length);
			osDownload.write(allData);
文件读取处理:
               int column = 1;	
		//文件读取、文件读取指定编码
		InputStreamReader reader = new InputStreamReader(form.getFile()
				.getInputStream(),"UTF-16LE");
		//文件流读取对象创建
		BufferedReader buf = new BufferedReader(reader);
		String line = "";
		while ((line = buf.readLine()) != null) {
			line = line.replace("\"","");
			if(line.length() == 0||line.replaceAll("\t","").length() == 0){
				continue;
			}
			byte utf_16 [] = line.getBytes("UTF-16LE");
			//BOM处理  UTF-16LE编码    1,2值为-1,-2
			if(utf_16[0] == -1 && utf_16[1] == -2){
				line = new String(line.getBytes("UTF-16LE"),2,
						line.getBytes("UTF-16LE").length - 2,"UTF-16LE");
			}
			// 按指定分隔符分割处理
			String[] st = new String(line.getBytes(),"UTF-8").split("\t");
			// 列数,内容等等处理
			if (st.length == 15)
				//文件内容CHECK
			count++;
		}
		buf.close();		

第二种方法简单点,只需添加UTF-8的BOM信息即可,

在Struts的Action里用流生成CSV文件的时候,在一开始就加上这样一句

1.out = response.getOutputStream();   
2.//加上UTF-8文件的标识字符   
3.out.write(new byte[]{(byte)0xEF,(byte)0xBB,(byte)0xBF});   

当然了,因为加有BOM信息,csv在读取操作的时候,也要做“删除”BOM信息操作。

byte utf[] = line.getBytes();
//BOM 処理 -17, -69, -65
if(utf[0] == -17 && utf[1] == -69 && utf[2] == -65){
	line = new String(utf,3,utf.length - 3);
}


 
 


╭︿︿︿╮
{/ o  o /} 
 ( (oo) )  
  ︶ ︶︶:<XX操作系统下> CSV 文件出力 用excel打开乱码

PS:小弟惭愧,最开始使用的处理方法为第一种,后来因同事提醒,才有了现在第二种处理方法,⊙﹏⊙b汗。。。

 

 


                
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 在使用 Python 导出 CSV 文件时,如果在 Excel打开显示乱码,可能是因为 Excel 无法识别 CSV 文件的编码格式。 解决方法有以下几种: 1. 使用 Python 的 `codecs` 库进行编码转换,将 CSV 文件从原来的编码转换为 UTF-8 编码,然后再用 Excel 打开。 2. 在 Excel 中使用「数据」选项卡中的「获取外部数据」按钮,选择「从文本」选项,然后手动选择 CSV 文件的编码格式。 3. 使用文本编辑器(如 Notepad++)打开 CSV 文件,然后将其转换为 UTF-8 编码,再用 Excel 打开。 希望以上内容能帮助到你! ### 回答2: 当使用Python导出CSV文件,并用Excel打开时出现乱码问题,可以尝试以下解决方法。 1. 指定CSV文件的编码格式:在导出CSV文件时,可以使用`encoding`参数指定文件的编码格式。例如,可以使用UTF-8编码格式来导出CSV文件,以确保兼容性。 2. 使用Excel打开时选择正确的编码格式:在Excel打开CSV文件时,可以选择正确的编码格式来避免乱码问题。在打开文件时,选择正确的编码格式,如UTF-8,以确保文本正确显示。 3. 使用文本导入向导打开CSV文件:在Excel的“数据”选项卡下,选择“从文本”功能打开CSV文件。这样做可以通过导入向导指定正确的编码格式和分隔符,以确保数据正确显示。 4. 使用其他软件或编辑器打开CSV文件:如果Excel仍然无法正确显示CSV文件,可以尝试使用其他软件或文本编辑器打开。例如,可以使用记事本、Sublime Text、Notepad++等文本编辑器,或者其他电子表格软件如Google Sheets来打开CSV文件,然后再尝试将其导入Excel。 通过以上方法,希望能够解决Python导出CSV文件Excel乱码的问题,并正确显示CSV文件中的文本内容。 ### 回答3: 当使用Python导出CSV文件并使用Excel打开时出现乱码的问题通常是由于文件编码的原因。在Python中,CSV文件的默认编码为UTF-8,而Excel默认使用的是ANSI编码。这种编码不匹配可能导致乱码问题。 解决这个问题有以下几种方法: 1. 使用Excel打开CSV文件之前,可以先将文件的编码转换Excel所支持的编码,如GB2312。可以使用Python的`codecs`模块来实现编码转换,例如: ```python import codecs # 读取UTF-8编码的CSV文件 with codecs.open('data.csv', 'r', 'utf-8') as f: content = f.read() # 将编码转换为GB2312并保存为新的CSV文件 with codecs.open('data_ansi.csv', 'w', 'gb2312') as f: f.write(content) ``` 2. 使用Python的`pandas`库来导出CSV文件,它有更好的编码处理能力。在写入CSV文件时,可以指定编码为ANSI,例如: ```python import pandas as pd # 将DataFrame写入CSV文件,并指定编码为ANSI df.to_csv('data.csv', encoding='ansi', index=False) ``` 使用这些方法之一,可以避免在使用Excel打开导出CSV文件时出现乱码的问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值