当前位置:首页 > 开发 > 编程语言 > Ruby > 正文

Rails的中文乱码问题

发表于: 2010-06-09   作者:酷的飞上天空   来源:转载   浏览:
摘要: 乱码情况一:netbeas控制台输出乱码 具体表现为:在程序中定义中文字符串,然后输出。但输出为乱码 解决方法:打开netbeans安装目录,找到etc目录下的netbeans.conf文件。在netbeans_default_options的最后面添加上-J-Dfile.encoding=UTF-8 这种情况,一般发生在win下面。   乱码情况二:含有中文目录或文件名的

乱码情况一:netbeas控制台输出乱码

具体表现为:在程序中定义中文字符串,然后输出。但输出为乱码

解决方法:打开netbeans安装目录,找到etc目录下的netbeans.conf文件。在netbeans_default_options的最后面添加上-J-Dfile.encoding=UTF-8

这种情况,一般发生在win下面。

 

乱码情况二:含有中文目录或文件名的输出为乱码

具体表现为:如:输出root目录,在其下包含有中文的目录或文件名为中文,输出时中文为乱码。

解决方法:设置Encoding.default_internal="UTF-8",其为表示默认内编码为UTF-8,这样目录在读取的时候就会自动转码为UTF-8。

注:如果初始目录的目录名包含中文,则会报找不到文件的错误,如:

No such file or directory - D:\素材 (Errno::ENOENT)  。D:\素材目录是存在的

这个问题,还没找到解决办法。。。

 

乱码情况三:读取文本文件,输出中文时出现乱码

具体表现为:要读取的文件内容含有中文,在输出时是乱码。原因是文本文件的保存编码和读取输出的编码不一致,如:在win平台下使用记事本新建一个包含中文的文本文件(默认为GBK编码),用netbeas输出时使用UTF-8编码,所以是乱码。

解决办法:

方法一:使用其他文本编辑器打开文本文件然后重新保存,保存编码选择UTF-8编码或其他自己需要的编码。

方法二:使用ruby的转码方法,如GBK转UTF-8,str.encode(Encoding.find("UTF-8"),Encoding.find("GBK"))。格式为str.encode(ecoding_to,encoding_from),encoding_to表示要转换的目的编码,from则为从什么编码转换

 

乱码情况四:rhtml中含有中文时出现的invalid byte sequence in GBK错误,这个虽然不算乱码但其原因还是中文的编码问题

具体表现为:当要显示的页面中含有中文时,会莫名的报出这个错误。再具体点就是页面的中文只有在特定的情况下才会发生后台报错,比如:JavaScript的中文注释引起错误,但在中文的注释后添加一个‘晕’的汉字后又不报错了。

我的解决方法是在application_controller.rb中添加Encoding.default_internal="UTF-8"。这样就不会出现上面的诡异异常了。

 

乱码情况五:从数据库中取得数据显示时报 incompatible character encodings: GBK and ASCII-8BIT或 incompatible character encodings: UTF-8 and ASCII-8BIT的错误

具体表现为:数据库中的中文不是乱码,取出来在页面显示时报编码错误。原因是刚从数据库取出来的时候字符串是ASCII-8BIT,尽管已经在database.yml中设置encoding:utf-8但是无效。

这个暂时没找到彻底的解决方法,我是在model里面涉及到中文字符串属性添加一个get前缀的方法,在其内进行转码如:

  def get_name
    return self.name.force_encoding(Encoding.default_internal)
  end

当需要取得model的name属性时,使用 model.get_name 代替以前的 model.name。 算是临时的解决方法吧。 

 

乱码情况六:使用ENV读取环境变量,包含中文的乱码。一般这种只发生在win系统上。

直接贴代码,如下:

#coding:utf-8
user = ENV['user']
puts "#{user}"
#puts "user的内容是:#{user}" 这句抛出incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError)
puts "user对象是否被冻结:#{user.frozen?}"
puts "user的编码是:#{user.encoding}"
#如果使用破坏性的方法encode!则会出现can't modify frozen string (RuntimeError)的错误
#如果第二个参数是ASCII-8BIT 则会出现"\xBF" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)的错误
user = user.encode(Encoding.find("utf-8"),Encoding.find("gbk"))
puts "解码后的user是:#{user}"
# 比较奇怪的是 user 明明是GBK编码的,可是encoding方法返回的却是ASCII-8BIT。难道ruby又自作多情的把GBK转换为ASCII-8BIT么?

 

输出如下:

��ķ������
user对象是否被冻结:true
user的编码是:ASCII-8BIT
解码后的user是:酷的飞上天空

 

上面的乱码在我机器上是一个一个的方块。

 

 

 

暂时就遇到这些了,以后补充。大部分的乱码都是系统造成的,看来在win系统上开发还真是问题多多啊。

 

ruby1.9.1中可以使用魔法注释,即在脚本的第一行添加#coding:UTF-8,这样可以指定脚本所使用的编码。举个例子如下:

#coding:utf-8
puts "中文".length

#输出 2

#coding:ASCII-8BIT
puts "中文".length

输出 6

 

我想应该就是确定脚本中定义的字符串的编码的作用

 

在此版本中废除了全局变量$KCODE

 

附件中含有中文ruby1.9.1的参考手册

 

Rails的中文乱码问题

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
这个问题到处都是,放在这里记下来日后也好查了,赫赫 首先对于中国的开发者使用mysql实例配置工具
问题描述 在JSP中使用form表单向后台action中传递中文参数,后台action接收到参数出现中文乱码。JSP
springMVC传参中会出现中文乱码问题。学习中提供了两种解决方案: 第一种是在tomcat中加参数 第二种
最近两年一直使用logback作为日志记录框架,一直很正常,今天突然遇到一个问题,日志框架控制台打印
Web项目 Jsp+Tomcat+Mysql乱码解决终极篇 写在之前: 编码出现错误了在web开发的情况下是常常出现的
解决方法: 1、关闭数据库连接; 2、右击数据库选择“连接属性”; 3、选择“高级”属性页,将“使用
eclipse之所以会出现乱码问题是因为eclipse编辑器选择的编码规则是可变的。一般默认都是UTF-8或者GB
第一步: 在 struts.xml 加 <constant name="struts.i18n.encoding" value="GBK"/><!--国
之前总是碰到JSP页面乱码的问题,每次都是现在网上搜,然后胡乱改,改完也不明白原因。 这次正好作
问题描述: 通过mybatis写入中文数据出现乱码,通过输出查看得知从前端传递给后端的中文是正常的,
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号