Rails中文乱码问题【转】

乱码情况一: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

def get_name
  returnself.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  

 

 

我想应该就是确定脚本中定义的字符串的编码的作用
原文:http://314858770.iteye.com/blog/687978
原文地址:https://www.cnblogs.com/zs-note/p/3346673.html