• 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
  • 相关阅读:
    前端事件系统(四)
    前端事件系统(三)
    前端事件系统(二)
    前端事件系统(一)
    前端图片选择问题
    浅谈前端移动端页面开发(布局篇)
    诙谐论设计模式(一)——创建型设计模式
    总结三年未满的工作经历,写下自己对技术的坚持
    java内存优化牛刀小试
    将上下文融入知识图谱以进行常识推理
  • 原文地址:https://www.cnblogs.com/zs-note/p/3346673.html
Copyright © 2020-2023  润新知