发布于 2015-04-06 08:55:48 | 334 次阅读 | 评论: 1 | 来源: PHPERZ

这里有新鲜出炉的精品教程,程序狗速度看过来!

Vagrant 创建虚拟化开发环境

Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它 使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境。


错误描述

今天使用vagrant ,代码同步:vagrant rsync-auto 发现代码同步失效了,几次重启之后发现启动报错:

有点疑惑,因为1h之前还同步过修改的代码,现在突然报错,目前仍然不明原因(这1h之内没有做过任何编码设置/修改的操作,仍然诡异,留待大神研究吧~)以下直接说重点

错误原因

vagrant的源码使用Ruby实现的,Ruby 转码的方法:encode 有转码兼容,GBK转码为UTF-8不兼容,所以报错,报错行的源代码:
data << io.readpartial(READ_CHUNK_SIZE).encode(“UTF-8”, Encoding.default_external)

解决方法

思路:将参数用 force_encoding方法 强制转换成UTF-8编码即可
方法:找到报错的目录:C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.7.2\lib\vagrant\util io.rb文件找到line 32,将代码修改为:
data << io.readpartial(READ_CHUNK_SIZE).force_encoding(‘UTF-8’)

然后vagrant reload 没有报错,重启成功,代码同步成功。这是vagrant的一个bug。


说说这里面的曲折过程,最开始发现这个错误以后,我将错误提示:”from GBK to UTF-8”理解成:
要转码为UTF-8必须要求原编码是GBK,所以我改了io.rb中出错的源码成这个样子:

str = io.readpartial(READ_CHUNK_SIZE).force_encoding(‘GBK’) //强制转换为GBK
data << str .encode(“UTF-8”, Encoding.default_external) //将GBK转换为UTF-8

这样还是报错,然后我看到转码的encode有编码兼容,所以使用强制转换的方式转换为UTF-8,果然还是简单粗暴比较好呀~~
 



最新网友评论  共有(1)条评论 发布评论 返回顶部
syw 发布于2016-06-27 05:14:16
不行啊
支持(0)  反对(0)  回复

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务