61阅读

vc实现avi转换mp4代码-python轻松实现代码编码格式转换

发布时间:2017-11-21 所属栏目:国内外网站技术现状

一 : python轻松实现代码编码格式转换

由于某些原因,需要将代码从A机房迁移到B机房,这两个之间不能互相访问,但是历史原因导致A机房的代码全是utf8编码的,B机房要求是GBK编码,看看这个怎么解决。虽然很简单,但是还是要推荐给大家,需要的小伙伴参考下吧。

最近刚换工作不久,没太多的时间去整理工作中的东西,大部分时间都在用来熟悉新公司的业务,熟悉他们的代码框架了,最主要的是还有很多新东西要学,我之前主要是做php后台开发的,来这边之后还要把我半路出家的前端学好、还要学习C++,哈哈,总之很充实了,每天下班回家都可以睡的很香(一句话总结,就是吃得香、睡的香~)。再说说换工作时候吧,今年年初正式毕业半年了,感觉自己技术增长很快,原公司里面程序员的地位还不如运营,所以想换个工作,面试了3家(2家大的、一家小的),都给offer了,当然从大公司里面挑了个各方面综合(工资、干什么、交通等等)还不错的,反正感觉就很顺利的进来了(比毕业的时候容易多了),哈哈,越努力、越幸运,越幸运、越努力!。从这周开始,继续整理博客,免得给自己造成懒得习惯。

刚来这个公司,熟悉了环境,老大就开始让我做一个迁移、修改代码的工作,我想说的是,这种工作真没劲~~,看别人的代码、改别人的代码、这里改个变量、那里改个文件名······,都是些没技术含量、很繁琐的事情,不过通过迁移代码顺便熟悉下环境也好。扯了这么多,说说今天的主题吧——代码编码格式改变,由于某些原因,需要将代码从A机房迁移到B机房,这两个之间不能互相访问,但是历史原因导致A机房的代码全是utf8编码的,B机房要求是GBK编码,看看这个怎么解决。

编码问题
先说说为什么会有编码问题,就拿上面那个例子来说,B机房这边数据库全是GBK编码的,因此从数据库中取出来的数据都是GBK的,从数据库中取出来的数据是GBK编码的,要在展示的时候不乱码,在不对数据库取出的数据转换的情况下,就需要发送header的时候设置编码为GBK,输出的文件(html、tpl等)都必须是GBK的,看看下面这个图会更清楚点:

DB(GBK) => php等(编码格式不限但如果代码文件中有汉字,文件就要是gbk编码或者在汉字输出的时候转化为gbk) => header(GBK) => html、tpl(GBK)

或者还有一种方式只在出库的时候在代码中将utf8转化为gbk,总的来说utf8还是更流行点,问题更少点

DB(GBK) => php等(utf8,并将从数据库取出的数据转化为utf8) => header(utf8) => html、tpl(utf8)

只要按照上面这两种规范编码格式,就不会出现乱码情况,起码我测试的第一种方式是没问题的,所以我猜第二种也ok,好了,现在就来写一个转换文件编码格式的小脚本:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 #!/usr/bin/python # -*- coding: utf-8 -*- #Filename:changeEncode.py import os import sys def ChangeEncode(file,fromEncode,toEncode): try: f=open(file) s=f.read() f.close() u=s.decode(fromEncode) s=u.encode(toEncode) f=open(file,"w"); f.write(s) return 0; except: return -1; def Do(dirname,fromEncode,toEncode): for root,dirs,files in os.walk(dirname): for _file in files: _file=os.path.join(root,_file) if(ChangeEncode(_file,fromEncode,toEncode)!=0): print "[转换失败:]"+_file else: print "[成功:]"+_file def CheckParam(dirname,fromEncode,toEncode): encode=["UTF-8","GBK","gbk","utf-8"] if(not fromEncode in encode or not toEncode in encode): return 2 if(fromEncode==toEncode): return 3 if(not os.path.isdir(dirname)): return 1 return 0 if __name__=="__main__": error={1:"第一个参数不是一个有效的文件夹",3:"源编码和目标编码相同",2:"您要转化的编码不再范围之内:UTF-8,GBK"} dirname=sys.argv[1] fromEncode=sys.argv[2] toEncode=sys.argv[3] ret=CheckParam(dirname,fromEncode,toEncode) if(ret!=0): print error[ret] else: Do(dirname,fromEncode,toEncode)

脚本很简单,使用也很简单

代码如下:
./changeEncode.py target_dir fromEncode toEncode

这里要注意下,几种常见编码的关系:

us-ascii编码是utf-8编码的一个子集,这个是从stackoverflow上得到的,原文如下ASCII is a subset of UTF-8, so all ASCII files are already UTF-8 encoded,

我试了下确实是的,在不加汉字的时候显示编码为us-ascii,加了汉字之后,变为utf-8。

还有就是ASNI编码格式,这代表是本地编码格式,比如说在简体中文操作系统下,ASNI编码就代表GBK编码,这点还需要注意

还有一点就是一个在linux下查看文件编码格式的命令是:

代码如下:
file -i *

可以看到文件的编码格式。

当然了,上面的可能有些文件中有特殊字符,处理的时候会失败,但一般程序文件是没有问题的。

以上就是本文所述的全部内容了,希望对大家学习python能够有所帮助。

请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!

二 : hibernate结果集转换器ResultTransformer。基于别名实现

public class AliasedResultTransformer extends AliasedTupleSubsetResultTransformer {private static final Logger logger = LoggerFactory.getLogger(AliasedResultTransformer.class);private static final long serialVersionUID = 1L;private final Class<?> resultClass;// 结果集类型private String[] columnAlias = {};// 查询语句栏位别名private ConstructorAccess<?> constructorAccess;// 构造函数访问器private MethodAccess methodAccess;// 方法访问器private String[] methodNames;// 方法名private int[] methodIndexs;// 方法索引private Class<?>[][] argsTypes;// 栏位别名参数类型/方法参数类型private String sql;// 查询语句private boolean sqlQueryAll = false;// sql查询所有栏位,默认falseprivate boolean hqlQueryAll = false;// hql查询所有栏位,默认false/** * 构造基于sql/hql别名的结果集转换器 * * @param resultClass * 结果集类型 * @param sql * sql/hql语句 */public <T> AliasedResultTransformer(Class<T> resultClass, String sql) {//if (sql.indexOf("select new") > -1) {//throw new IllegalStateException("hql使用了select newJavaBean() from...方式,就不需要设置query.setResultTransformer()了。");//}//if (resultClass == null) {//throw new IllegalArgumentException("resultClass cannot be null");//}this.resultClass = resultClass;this.sql = sql;this.constructorAccess = AsmUtils.get().createConstructorAccess(resultClass);this.methodAccess = AsmUtils.get().createMethodAccess(resultClass);QueryStatement statement = QueryStatementCache.getInstance().get(sql);if (statement != null) {this.methodIndexs = statement.getMethodIndexs();this.columnAlias = statement.getColumnAlias();this.argsTypes = statement.getArgsTypes();this.hqlQueryAll = statement.isHqlQueryAll();this.sqlQueryAll = statement.isSqlQueryAll();} else {if (sql.indexOf("*") > 0 && sql.indexOf("count(*)") < 0) {this.sqlQueryAll = true;} else {this.hqlQueryAll = ColumnAliasParser.getInstance().isQueryAll(sql);if (hqlQueryAll) {QueryStatement stmt = new QueryStatement();stmt.setHqlQueryAll(hqlQueryAll);QueryStatementCache.getInstance().put(sql, stmt);}}if (!hqlQueryAll && !sqlQueryAll) {// 不是查询所有栏位,需要重新解析sql/hqlthis.columnAlias = ColumnAliasParser.getInstance().parseColumnAlias(sql, true);String[] tempMethodNames = this.methodAccess.getMethodNames();this.methodNames = new String[columnAlias.length];this.methodIndexs = new int[columnAlias.length];this.argsTypes = new Class<?>[columnAlias.length][];Class<?>[][] tempArgsTypes = this.methodAccess.getParameterTypes();for (int i = 0; i < columnAlias.length; i++) {for (int j = 0; j < tempMethodNames.length; j++) {String methodName = tempMethodNames[j];if (methodName.startsWith("set")&& columnAlias[i].equals(StringUtils.uncapitalize(methodName.substring(3)))) {methodNames[i] = methodName;methodIndexs[i] = this.methodAccess.getIndex(methodName);argsTypes[i] = tempArgsTypes[j];}}}QueryStatement stmt = new QueryStatement();stmt.setArgsTypes(argsTypes);stmt.setColumnAlias(columnAlias);stmt.setMethodIndexs(methodIndexs);stmt.setHqlQueryAll(hqlQueryAll);stmt.setSqlQueryAll(sqlQueryAll);QueryStatementCache.getInstance().put(sql, stmt);}}}public boolean isTransformedValueATupleElement(String[] aliases, int tupleLength) {return false;}public Object transformTuple(Object[] tuple, String[] aliases) {if (hqlQueryAll) {return (tuple.length == 1 ? tuple[0] : tuple);} else if (sqlQueryAll) {this.columnAlias = aliases;// 没有解析过,将解析if (methodIndexs == null || methodIndexs.length <= 0|| argsTypes == null || argsTypes.length <= 0) {this.methodIndexs = new int[columnAlias.length];this.argsTypes = new Class<?>[columnAlias.length][];Class<?>[][] tempArgsTypes = this.methodAccess.getParameterTypes();for (int i = 0; i < aliases.length; i++) {String methodName = "set" + CamelCaseUtils.toCapitalizeCamelCase(aliases[i]);try {methodIndexs[i] = methodAccess.getIndex(methodName);argsTypes[i] = tempArgsTypes[methodIndexs[i]];} catch (IllegalArgumentException e) {logger.info("方法[" + methodName + "]不存在,可能是Entity关联栏位。" + e.getMessage());}}QueryStatement stmt = new QueryStatement();stmt.setArgsTypes(argsTypes);stmt.setColumnAlias(columnAlias);stmt.setMethodIndexs(methodIndexs);stmt.setHqlQueryAll(hqlQueryAll);stmt.setSqlQueryAll(sqlQueryAll);QueryStatementCache.getInstance().put(sql, stmt);}}Object entity = constructorAccess.newInstance();for (int i = 0; i < aliases.length; i++) {methodAccess.invoke(entity, methodIndexs[i], tuple[i]);}return entity;}/** * sql栏位别名对应的类型 * * @return 别名类型 * @author yinlei date 2013-6-9 下午7:50:50 */public Class<?>[][] getArgsTypes() {return argsTypes;}/** * 获取sql中栏位别名数组 * * @return 栏位别名 * @author yinlei date 2013-6-9 下午7:50:04 */public String[] getColumnAlias() {return columnAlias;}public boolean equals(Object o) {if (this == o) {return true;}if (o == null || getClass() != o.getClass()) {return false;}AliasedResultTransformer that = (AliasedResultTransformer) o;if (!resultClass.equals(that.resultClass)) {return false;}if (!Arrays.equals(columnAlias, that.columnAlias)) {return false;}return true;}public int hashCode() {int result = resultClass.hashCode();result = 31 * result+ (columnAlias != null ? Arrays.hashCode(columnAlias) : 0);return result;}}
public class AliasedResultTransformer extends AliasedTupleSubsetResultTransformer {private static final Logger logger = LoggerFactory.getLogger(AliasedResultTransformer.class);private static final long serialVersionUID = 1L;private final Class<?> resultClass;// 结果集类型private String[] columnAlias = {};// 查询语句栏位别名private ConstructorAccess<?> constructorAccess;// 构造函数访问器private MethodAccess methodAccess;// 方法访问器private String[] methodNames;// 方法名private int[] methodIndexs;// 方法索引private Class<?>[][] argsTypes;// 栏位别名参数类型/方法参数类型private String sql;// 查询语句private boolean sqlQueryAll = false;// sql查询所有栏位,默认falseprivate boolean hqlQueryAll = false;// hql查询所有栏位,默认false/** * 构造基于sql/hql别名的结果集转换器 * * @param resultClass * 结果集类型 * @param sql * sql/hql语句 */public <T> AliasedResultTransformer(Class<T> resultClass, String sql) {//if (sql.indexOf("select new") > -1) {//throw new IllegalStateException("hql使用了select new JavaBean() from...方式,就不需要设置query.setResultTransformer()了。");//}//if (resultClass == null) {//throw new IllegalArgumentException("resultClass cannot be null");//}this.resultClass = resultClass;this.sql = sql;this.constructorAccess = AsmUtils.get().createConstructorAccess(resultClass);this.methodAccess = AsmUtils.get().createMethodAccess(resultClass);QueryStatement statement = QueryStatementCache.getInstance().get(sql);if (statement != null) {this.methodIndexs = statement.getMethodIndexs();this.columnAlias = statement.getColumnAlias();this.argsTypes = statement.getArgsTypes();this.hqlQueryAll = statement.isHqlQueryAll();this.sqlQueryAll = statement.isSqlQueryAll();} else {if (sql.indexOf("*") > 0 && sql.indexOf("count(*)") < 0) {this.sqlQueryAll = true;} else {this.hqlQueryAll = ColumnAliasParser.getInstance().isQueryAll(sql);if (hqlQueryAll) {QueryStatement stmt = new QueryStatement();stmt.setHqlQueryAll(hqlQueryAll);QueryStatementCache.getInstance().put(sql, stmt);}}if (!hqlQueryAll && !sqlQueryAll) {// 不是查询所有栏位,需要重新解析sql/hqlthis.columnAlias = ColumnAliasParser.getInstance().parseColumnAlias(sql, true);String[] tempMethodNames = this.methodAccess.getMethodNames();this.methodNames = new String[columnAlias.length];this.methodIndexs = new int[columnAlias.length];this.argsTypes = new Class<?>[columnAlias.length][];Class<?>[][] tempArgsTypes = this.methodAccess.getParameterTypes();for (int i = 0; i < columnAlias.length; i++) {for (int j = 0; j < tempMethodNames.length; j++) {String methodName = tempMethodNames[j];if (methodName.startsWith("set")&& columnAlias[i].equals(StringUtils.uncapitalize(methodName.substring(3)))) {methodNames[i] = methodName;methodIndexs[i] = this.methodAccess.getIndex(methodName);argsTypes[i] = tempArgsTypes[j];}}}QueryStatement stmt = new QueryStatement();stmt.setArgsTypes(argsTypes);stmt.setColumnAlias(columnAlias);stmt.setMethodIndexs(methodIndexs);stmt.setHqlQueryAll(hqlQueryAll);stmt.setSqlQueryAll(sqlQueryAll);QueryStatementCache.getInstance().put(sql, stmt);}}}public boolean isTransformedValueATupleElement(String[] aliases, int tupleLength) {return false;}public Object transformTuple(Object[] tuple, String[] aliases) {if (hqlQueryAll) {return (tuple.length == 1 ? tuple[0] : tuple);} else if (sqlQueryAll) {this.columnAlias = aliases;// 没有解析过,将解析if (methodIndexs == null || methodIndexs.length <= 0|| argsTypes == null || argsTypes.length <= 0) {this.methodIndexs = new int[columnAlias.length];this.argsTypes = new Class<?>[columnAlias.length][];Class<?>[][] tempArgsTypes = this.methodAccess.getParameterTypes();for (int i = 0; i < aliases.length; i++) {String methodName = "set" + CamelCaseUtils.toCapitalizeCamelCase(aliases[i]);try {methodIndexs[i] = methodAccess.getIndex(methodName);argsTypes[i] = tempArgsTypes[methodIndexs[i]];} catch (IllegalArgumentException e) {logger.info("方法[" + methodName + "]不存在,可能是Entity关联栏位。" + e.getMessage());}}QueryStatement stmt = new QueryStatement();stmt.setArgsTypes(argsTypes);stmt.setColumnAlias(columnAlias);stmt.setMethodIndexs(methodIndexs);stmt.setHqlQueryAll(hqlQueryAll);stmt.setSqlQueryAll(sqlQueryAll);QueryStatementCache.getInstance().put(sql, stmt);}}Object entity = constructorAccess.newInstance();for (int i = 0; i < aliases.length; i++) {methodAccess.invoke(entity, methodIndexs[i], tuple[i]);}return entity;}/** * sql栏位别名对应的类型 * * @return 别名类型 * @author yinlei date 2013-6-9 下午7:50:50 */public Class<?>[][] getArgsTypes() {return argsTypes;}/** * 获取sql中栏位别名数组 * * @return 栏位别名 * @author yinlei date 2013-6-9 下午7:50:04 */public String[] getColumnAlias() {return columnAlias;}public boolean equals(Object o) {if (this == o) {return true;}if (o == null || getClass() != o.getClass()) {return false;}AliasedResultTransformer that = (AliasedResultTransformer) o;if (!resultClass.equals(that.resultClass)) {return false;}if (!Arrays.equals(columnAlias, that.columnAlias)) {return false;}return true;}public int hashCode() {int result = resultClass.hashCode();result = 31 * result+ (columnAlias != null ? Arrays.hashCode(columnAlias) : 0);return result;}}
/** * 查询VO Bean List,一般用于多实体连接<br> * 1、使用select new查询VO Bean,select new com.eecn.warehouse.api.model.AUser(i.sbillno,u) from Inventory i, User u where i.scustomerno = u.userAccount<br> * 2、使用别名查询VO Bean,select i.sbillno as id,u as user from Inventory i, User u where i.scustomerno = u.userAccount,VO要有对应的构造函数<br> * 3、如果不使用别名,返回List<Object[]>,对于2中的结果返回{“sbillno”, User}<br> * 4、查询PO也是可以的,但是建议使用{@link #getEntityListByHql(String, Object...)}代替<br> * @param hql * @param resultClass * @param values * @return */ public <E> List<E> getListByHql(String hql, Class<E> resultClass, Object... values){ //hql = "select new com.eecn.warehouse.api.model.User(u.id,u.userAccount,u.userName) from User u "; //hql = "select u from User u"; //hql = "select i.sbillno as id,u as user from Inventory i, User u where i.scustomerno = u.userAccount order by i.dindate desc"; //hql = "select i.sbillno,u from Inventory i, User u where i.scustomerno = u.userAccount order by i.dindate desc"; //hql = "select new com.eecn.warehouse.api.model.Address(u.id,u.userAccount,u.userName) from User u"; //hql = "select new com.eecn.warehouse.api.model.AUser(i.sbillno,u) from Inventory i, User u where i.scustomerno = u.userAccount order by i.dindate desc"; Query query = createQuery(hql, values);//HQLQueryPlan hqlQueryPlan = getHqlQueryPlan(hql);//String[] aliases = hqlQueryPlan.getReturnMetadata().getReturnAliases();//String[] sqls = hqlQueryPlan.getSqlStrings();if (resultClass != null && hql.indexOf("select new") < 0) {query.setResultTransformer(new AliasedResultTransformer(AUser.class, hql));}//System.out.println(Arrays.toString(query.getReturnAliases()));List<E> list = query.list();if (list == null) {list = Collections.emptyList();}return list; }

三 : 巧用代理实现内外网站的自动转换

本人所在单位启用了内部OA(办公自动化)系统,由于有许多部门并不在公司总部,不处于同一个局域网内,外围单位无法直接访问内网的OA服务器,影响了OA系统在总公司的推行。为了解决这一问题曾试图通过VPN来从互联网接入,但由于外围单位分别通过不同的ISP(Internet Service Provider)接入互联网的,导致VPN服务器配置的不一致,不能全面畅通接入,最终选择了使用代理服务器的接入方案。外围单位可以从互联网通过代理服务器访问内网的OA服务器。 

  外网用户在访问公司OA服务器时,就需要在IE浏览器中配置代理服务器,配置方法见图1。

  图1 设置代理服务器 

  配置好IE后就可以访问内网OA服务器了。但这样一来,就存在一个问题,就是外网用户在访问OA时需要在IE中设置代理服务器,而在访问互联网时又需要取消这一配置,不使用代理服务器而直接访问。每次都需要手动配置,十分不便,对于“菜鸟”而言就更显得繁琐了。 

  如何让IE浏览器自动实现配置的转换呢?这就需要用到代理自动配置脚本(PAC-file:Proxy Auto-Config file) 了。自动配置脚本也就是PAC脚本,这是一种以.PAC为扩展名的JavaScript脚本,PAC脚本其实就是定义一个名为“FindProxyForURL”的Java Script函数,该函数会被浏览器自动调用,从而实现代理服务器的自动转换。 

  由于我们的代理是反向(由外向内)的,脚本的具体内容如下: 

  function findproxyforurl(host,url) 

  { 

  if (shexpmatch(host,"*.jigang.com.cn")) 

    return "proxy 218.XXX.XXX.30:8080" 

  else if (shexpmatch(host,"172.16.*.*")) 

   return "proxy 218.XXX.XXX.30:8080" 

  else 

   return "direct" 

  } 

  这段脚本的含义就是:如果是访问内网OA的请求(域名为jigang.com.cn),则使用代理,如果访问内网的某些网址(IP地址为:172.16.*.*),则使用代理,除此之外的所有请求则不使用代理而直接连接。 

  将上述脚本内容保存为一个扩展名为PAC的脚本文件,如C:proxy.pac。 

  然后我们设置IE浏览器把“自动配置脚本选项”指向它,完成集中设置代理配置的工作。我们只需一次性配置完毕,让IE自动识别是否使用代理服务器,而无需手动转换,从而实现访问内、外网站的自动转换。 

  IE的代理设置里面有一个“使用自动配置脚本”的选项,这里的具体设置如下: 

  自动配置脚本设置:打开浏览器,选择“工具/Internet选项/连接/局域网配置”,随后勾选“使用自动脚本配置”项,最后输入自动配置脚本所存在地址即可(比如file://C:proxy.pac,如图2)。 

  图2 设置本机自动配置脚本 

  当然我们也可以将这个脚本文件放在Wrb服务器上,这样不用为每台客户机都写一个PAC文件了,只需要在“使用自动配置脚本”的地址处填入相关的IP地址就行了。比如
 图3 设置网络自动配置脚本 

  这样做的好处是,我们可以随意修改代理脚本从而改变代理服务器的地址或端口等而不用去修改每台客户机的PAC文件了。
 

本文标题:vc实现avi转换mp4代码-python轻松实现代码编码格式转换
本文地址: http://www.61k.com/1105578.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1