一次Mono解析Excel文档编码出错排查记录
最近在捯饬Asp.Net站点部署到Linux平台上面,在文档导入的操作中经过网上搜索采用了能够支持跨平台的ExcelDataReader组建。在本地windows上测试通过NuGet安装的组建,这货依赖了SharpZipLib .Net下鼎鼎有名的解压缩组建,应该用来解压Excel文档的。本地测试没读取正常没有问题,但发布到Linux上运行总是无法读取,返回Null,这让我很是迷惑!接下来准备找出问题所在~
1)下载了ExcelDataReader源码本地编译测试 问题依然存在,读取不到数据。
2)Linux平台非开发环境,在源码上定位到错误打印方法上发现输出是ExceptionMessage,更改为.ToString() 并用控制台打印输出,观察代码出错行。得到如下结果:
错误信息居然是SharpZipLib报的...... 好吧,继续下载SharpZipLib源码找问题。
3)下载完成SharpZipLib源码,定位到SharpZipLib.Zip.ZipConstants.ConvertToString (System.Byte[] data, Int32 count)方法:
这里代码很简单,错误是找不到对象,if判断就是检查data是否为null的,那么肯定不是判断里面的错误了。那么只有可能是下面的字节数组转字符串报错的,仔细看下不明白int类型的DefaultCodePage是什么鬼,和我平时写的Encoding.GetEncoding("utf8").GetString(data, 0, count);不一样。遂去找了下DefaultCodePage的定义:
找了下CodePage的定义,原来这玩意叫做内码表 是定义了字符编码类型映射的一个整形数字
百度百科这样说:
1 |
CodePage:可读/可写。整型。定义用于在浏览器中显示页内容的代码页。代码页是字符集的数字值,不同的语言使用不同的代码页。例 如,ANSI代码页为1252,日文代码页为932,简体中文代码页为936。一般情况下,当你上传到国外网页空间,或者提取数据库记录等出现乱码时,就 采用这种方法解决。 |
嗯,简体中文是936,难道我的文档是中文的原因?可是我也改成英文单词还是不行啊,试着打印下运行中的这个DefaultCodePage是多少:
OEMCodePage又是什么鬼呢?
找到这个介绍:http://dcx.sap.com/1200/zh/dbadmin/win-collation-natlang.html 意思是说这是老的Dos环境中使用的编码,我还以为服务器设备制造商所在地区的编码呢。。。。
(⊙ˍ⊙) 没错的样子,编码对的。。。
不解,先把这玩意改掉再说
return Encoding.GetEncoding(Encoding.Default.CodePage).GetString(data, 0, count);
我也用CodePage,用.Net环境获取到的CodePage,然后运行测试,没问题了:
文档内容:
解析代码:
FileStream stream = System.IO.File.Open("ArticleTemplate.xlsx", FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
Console.WriteLine("");
excelReader.IsFirstRowAsColumnNames = true;
DataSet ds = excelReader.AsDataSet();
if (ds == null)
{
Console.WriteLine("ds Is Null");
}
else
{
Console.WriteLine("Read Ok");
}
foreach (DataTable dt in ds.Tables)
{
foreach (DataRow dr in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
Console.WriteLine(dr[i]);
}
}
}
(。_。)好吧,居然是这个问题导致的,那么.net环境在mono上获取的CodePage是多少呢?
查询得到 65001 代表的是 UTF-8
那么我的win环境下是什么样子呢?
都是936 也就是简体中文 也就是GBK编码。
现在的情况是linux环境获取到GBK编码但不能用,难道我的Linux环境没有GBK编码?locale查看当前系统使用的编码:
清一色的UTF8 没有GBK。 locale -a命令可以查看支持的编码,有显示支持GBK。
那么只能猜测 mono上运行.Net 程序做编码转换的时候只能转换成当前使用的编码?
目前更改成Encoding.Default能解决编码出错的问题了,但实际原因是不是我猜测的这样,我也不知道了。。。
一次Mono解析Excel文档编码出错排查记录的更多相关文章
- Android解析Excel文档完整示例
MainActivity如下: package cc.testexcel; import java.io.File; import jxl.Cell; import jxl.CellType; imp ...
- POI使用:用poi接口不区分xls/xlsx格式解析Excel文档(41种日期格式解析方法,5种公式结果类型解析方法,3种常用数值类型精度控制办法)
一.使用poi解析excel文档 注:全部采用poi接口进行解析,不需要区分xls.xlsx格式,不需要判断文档类型. poi中的日期格式判断仅支持欧美日期习惯,对国内的日期格式并不支持判断,怎么办? ...
- Oracle PLSQL读取(解析)Excel文档
http://www.itpub.net/thread-1921612-1-1.html !!!https://code.google.com/p/plsql-utils/ Introduction介 ...
- Java解析excel文档并以List<T>输出
/********************************************************工具类start*********************************** ...
- Java使用poi包读取Excel文档
项目需要解析Excel文档获取数据,就在网上找了一些资料,结合自己这次使用,写下心得: 1.maven项目需加入如下依赖: <dependency> <groupId>org. ...
- 读取EXCEL文档解析工具类
package test;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException ...
- 使用dom4j解析XML文档
dom4j的包开源包,不属于JDK里面,在myeclipse中要单独导入在项目中,这里不累赘了 做这个过程,很慢,因为很多方法没用过不熟悉,自己得去查帮助文档,而且还得去试,因为没有中文版,英文翻译不 ...
- 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...
- PHP读取excel文档
PHP读取excel文档 项目需要读取Excel的内容,从百度搜索了下,主要有两个选择,第一个是PHPExcelReader,另外一个是PHPExcel. PHPExcelReader比较轻量级, ...
随机推荐
- vue v-if with v-for
遍历和条件判断混合使用示例. <!DOCTYPE html> <html> <head lang="en"> <meta charset= ...
- review04
在编译源文件时,所用到的其他源文件也会被自动编译.这是因为它会使用到其他源文件产生的字节码文件. javac A.java A指的是源文件的名称 java B B指的是源文件中有main方法的类. 虽 ...
- cmscp实例笔记
1.迭代循环 [@NodeList;list] [#list list as node] [#if node.name == "产品试用"] [/#if] [#if node.na ...
- String随笔
1.古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:,请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想.程序流程图.源代码.结果截图. 设计思想:1)定义一个String类型 ...
- Chrome Adobe flash player已过期怎么办
越来越多的朋友感受到了来自谷歌chrome新版浏览器的压力,因为有不少朋友在使用新版chrome浏览器看视频时,却出现了这样的提示:Adobe flash player已过期!怎么办啊? 有网友抱怨: ...
- python any函数
pyhton的any() 函数: 判断给定的可迭代参数 iterable : 全部为 False,返回 False; 至少有一个为 True,则返回 True. 元素除了是 0.空.FALSE 外都算 ...
- redis学习主从配置
配置slave服务器只需要在配置文件中加入如下配置: slaveof 127.0.0.1 6379 即:slaveof masterip masterport
- 转载:电商项目完成的BUG调查原因和解决方案
转载: http://blog.csdn.net/yuexianchang/article/details/73197874
- Xml日志记录文件最优方案(附源代码)
Xml作为数据存储的一种方式,当数据非常大的时候,我们将碰到很多Xml处理的问题.通常,我们对Xml文件进行编辑的最直接的方式是将xml文件加载到XmlDocument,在内存中来对XmlDocume ...
- bzoj 4403 序列统计——转化成组合数的思路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4403 先说说自己的想法吧. 设f[ i ][ j ]表示当前在倒数第 i 个位置,当前和后面 ...