Ruby ruby 的中文支持。找了 1 个月了木有解决麻烦大神帮忙

Tonyhong · 2013年07月26日 · 最后由 seveniruby 回复于 2015年06月03日 · 9196 次阅读

中文支持怎么处理。求帮忙解决。。

$KCODE 那行改成 # coding: binary ?

3ks..貌似还是提示 invalid multibyte char。。

在源码最前面加上 # encoding: utf-8

在文件第一行加这个试试:# encoding: utf-8

谢谢大家,不过还是提示 invalid。。。。。

除了源代码第一行加上 # encoding: utf-8

你文件也得存成 utf-8 的才行。

@Tonyhong Ruby 哪个版本,1.8?

#8 楼 @blackanger ruby 1.9.3p392 (2013-02-22) [i386-mingw32]

#9 楼 @Tonyhong Ruby1.9 的话,我看你是读取 log 文件,可能需要设置外部编码和内部编码,在 Ruby1.9 的编码 IO 分这两种编码,还有要确定你的 log 文件的编码。你去看看相关文档吧。

或者看我的视频课程 XD。😄

在程序代码里设置# enconding:utf8 这种,只是设置了源码编码,解决不了你的问题。

#10 楼 @blackanger 谢谢。。学习下去。看看 io 编码。。3ks

#11 楼 @cantin @Tonyhong 他那也是解决办法。 文件存成 utf8,Ruby1.9 默认的外部编码就是 utf8 了。

不过我觉得还是了解实质比较好,文档得看看。 还有,如果文件不是 utf8,你也可以使用 IO 的编码来方便的处理文件。

#13 楼 @blackanger 默认的外部编码不是从外部环境取的吗?

#12 楼 @Tonyhong 建议你试下 #7 楼 的方法

#14 楼 @cantin 是啊,我没说不是啊。「文件存成 utf8,Ruby1.9 默认的外部编码就是 utf8 了。」

The default external encoding is initialized by the locale or -E option.

http://ruby-doc.org/core-2.0/Encoding.html#method-c-default_external

在 unix 下应该是根据 LC_CTYPE 这类环境变量吧

#12 楼 @Tonyhong $KODE 在 1.9.3 被弃用了。 你在最前面加上

# encoding: 'utf-8'
p __ENCODING__

如果是 utf-8 的话 后面应该就可以有中文了

好像你现在是 line 3 就出错了,根本到不了 File.open 那一行

#17 楼 @cantin 那是通过-E 参数设置的,Ruby1.9 开始,IO 也有编码了 http://www.ruby-doc.org/core-2.0/IO.html#method-i-external_encoding

#17 楼 @cantin 我看了下我的默认编码是 GBK

#20 楼 @Tonyhong 所以你需要指定 IO 时候的内部和外部编码来读 log,那样肯定就没问题了。 那个 GBK 应该是 log 文件的编码。

一般来说用 Ruby1.9 和 Ruby2.0 很少碰到这种中文编码问题了。除非是 IO 的时候。

#20 楼 @Tonyhong 你试试我上面写的,ENCODING是源代码的编码

#22 楼 @cantin rb:1: unknown encoding name: (ArgumentError) sorry! 又提示错误了。

#23 楼 @Tonyhong

#encoding: utf-8
p __ENCODING__

#23 楼 @Tonyhong 我之前用 sinatra 遇到过。 winodw 下,处理中文路径,需要 encode,如:url_path.encode("gbk", "utf-8") 或者 url_path.encode("utf-8",”gbk“) 看具体情况选择,你可以都试试。。

#21 楼 @blackanger

canmatoMacBook-Pro:ruby can$ file -I data.txt
data.txt: text/plain; charset=utf-16be

1.9.3p429 :002 > File.open('data.txt').read
 => "\xFE\xFF\u0000M\u0000y\u0000 \u0000d\u0000a\u0000t\u0000a"

1.9.3p429 :003 > File.open('data.txt', 'r:utf-8').read
 => "\xFE\xFF\u0000M\u0000y\u0000 \u0000d\u0000a\u0000t\u0000a"

1.9.3p429 :013 > File.open('data.txt', 'r:utf-16be:utf-16').read
 => "\uFEFF\uFEFFMy data"

猜测主要还是编辑器的问题。找个保存文件时能选择编码的编辑器,保存时注意选上 utf-8, 和开头的注释里写的 # encoding: utf-8 保持一致。

#26 楼 @cantin 噢,我说错了。 应该是 Ruby1.9 默认的外部编码是 US-ASCII 和 Ruby2.0 默认的外部编码是 utf-8 的。 应该是 Ruby1.9 默认的外部编码从环境变量中来,内部编码默认是 nil。

汗!

#27 楼 @blackanger 上面那个是错的,看这个

#encoding: utf-8

Encoding.default_external = 'US-ASCII'
puts Encoding.default_external

'啊'
File.open(__FILE__, 'r') do |f|
  p f.external_encoding.name
end

result: 
US-ASCII
"US-ASCII"


canmatoMacBook-Pro:ruby can$ file -I encoding.rb
encoding.rb: text/plain; charset=utf-8

#18 楼 @cantin @Tonyhong 源码编码, #encoding: utf-8 和 __ ENCODING _一个意思, _ ENCODING __只不过是一个保存源码编码的变量,没用。还是去指定 IO 的编码吧。 具体的看文档吧。

#30 楼 @cantin 嗯,我在 29 楼说了。

#30 楼 @cantin 你在 26 楼那也没问题。

#31 楼 @blackanger 应该是改变源代码编码,告诉 ruby 用什么编码方式读取这个源代码文件 LZ 的错误是在第三行,应该就是有中文的那一行,是在 ruby 不能解析这个字符,所以出错了

@cantin 不是的,源码编码是指他那段程序的编码。用#encoding:utf-8 指定。可以使用那个 encoding 变量来查看。读取文件还是 IO 的编码问题。 你可以查一下相关资料。你对源码编码是不是理解错了呢。

#34 楼 @cantin 在 Ruby1.9 中,使用 #encoding:utf-8,这种方式来改变源码编码。在 Ruby2.0 中,是默认 utf-8 的,你甚至都不用指定。 如果是源码编码的问题,何以楼主指定了#encoding: utf-8 还没效果呢?

#26 楼
@Tonyhong 你看看 26 楼@cantin 发的代码,就是设置 IO 的内外编码。剩下的你自己解决吧。

#34 楼 @cantin 你说的这个问题,楼主早改了。你不要看他发的那个图片了。你看 6 楼。

有个 Iconv 的 gem 可以去试试

#39 楼 @dddd1919 Iconv 在 Ruby2.0 都被抛弃了,在 Ruby1.9 已经发出过期警告了,Ruby1.9 中已经提供 Encoding 类了。

汗!

@Tonyhong 要解决了就冒个泡吧,给大家说说你咋解决的。 😄

擦的类 我想到终极奥义了 把 中国人 改成 chinese

#42 楼 @dddd1919 哈哈。那也解决不了啊,文件里面编码也不对啊。

#6 楼 @Tonyhong LZ 再上图吧,需要提示的说 #29 楼 @blackanger 外部编码是 default_external,是从环境变量取得的,你说的是 ruby 自身读取源代码所用的编码方式

#44 楼 @cantin

这么说吧:Ruby1.9 开始有三种默认编码,一种是源码编码。另外一种是 IO 对象编码,因为 IO 对象编码分为内部编码和外部编码,所以说是有三种默认编码。

网上有很多资料,你可以看看。看完以后再来讨论。 和环境变量有什么关系? 当然你强行使用了-E 参数去设置 Ruby1.9 的 IO 默认编码我有啥办法:

The default external encoding is initialized by the locale or -E option.

但是你要明白, -E 设置的和 IO 的默认外部编码,是同一个东西。

#45 楼 @blackanger default_extrernal 的来源,你说默认是从文件得到的是吧,你可以看看 30 楼的例子

#46 楼 @cantin 老大,我楼上已经说我说错了,已经修改了。划线的那行,看见没。

LC_CTYPE='US-ASCII' ruby -e 'p Encoding.default_external'
LC_CTYPE='UTF-8' ruby -e 'p Encoding.default_external'

你可以试试这个,记得将你系统对 LC 环境变量暂时注释掉先 #47 楼 @blackanger

另外 我从来没用—E 选项,麻烦看清楚点

#49 楼 @cantin 好吧,我又说错了。你是通过改变 locale,没用-E。

我试了:


  ~  LC_CTYPE='zh_CN.UTF-8' ruby -e 'p Encoding.default_external'
#<Encoding:UTF-8>

The default external encoding is initialized by the locale or -E option.

一样的效果。
我是有点把-E 和-e 记混了,不常用。

  ~  ruby -E US-ASCII:UTF-8 \
> -e 'p [Encoding.default_external, Encoding.default_internal]'
[#<Encoding:US-ASCII>, #<Encoding:UTF-8>]

这样可以在命令行指定内外部编码了。

所以这就是环境变量的作用啦

The default external encoding is initialized by the locale or -E option 这句话是关于你前面划掉的

后面 44 楼的回复是指你在 29 楼的回复,默认 ASCII 是源代码编码,而不是外部编码(default_external)

你在 44 楼说外部编码是 defaul_exrernal,是不对的。 #44 楼 @cantin 被你搞晕了,外部编码是 external_encoding,default_external 是默认外部编码,我说总感觉哪里不对。默认外部编码是来自于环境变量字符集,那到没错。

其实我想对楼主表达的意思是他去指定 IO 的内部编码和外部编码,去处理他碰到的编码问题更好。当然前提是他已经设置好了源码编码。

#53 楼 @blackanger 是的 44 楼跟 51 楼应该是默认外部编码,这个是我错了 话说我们好像歪楼了,LZ 都不出声了:)

#54 楼 @cantin 希望楼主能把问题解决了。

@Tonyhong 代码规范:URL 禁止出现字母、斜线、冒号,数字之外的任何字符。 从 URL 分析,楼主用 Windows。 首先,Windows 在中国大陆默认的系统编码是 GBK,而 Web 事实上的编码是 UTF-8; 此外,还有可能出现 UTF-8 或者 GBK 所没有的字符。 因此,即使你改好了,换个操作系统和其它国家地区的语言,还可能出现编码问题。 解决方案:不要在 URL 中出现非法字符。

#56 楼 @chq 在 url 中写中文之类的用的是 url 的 encode,跟文字的 encode 不是一回事

匿名 #58 2013年07月30日

logfile = NKF.nkf("-w",logfile)

ruby2.0 没有问题。。。ruby1.9 不晓得是不是因为楼主的编辑器字符集不是 UTF-8。导致打出的路径本来就不是 utf-8 编码。所以解析错误。我在 windows 下试过,没有这个问题。

匿名 #60 2013年07月30日

试试在文件首行插入:

encoding: utf-8

对于你的代码,有 2 个地方,本人不是很认同(不认同的别喷,只是本人的意见):

  1. 文件路径中含非英文。
  2. 程序的运行环境显然是在 Windows 下。

这贴,楼主已失踪了。

回来了。。这两天换了 ruby2.0 那个问题是解决了。

候用正则表达式提取文件中的一些字符串的时,log 中有汉字和字符数字。结果报错了。 `

': invalid byte sequence in GBK (ArgumentError)

这个问题你们讨论了一个月了,我真是无语了。

根源是因为 windows 在写文件的时候,会在文件投入插入一个\xFEFF 如果你保存了 json, 那么用 json parse 解析是会报错的。 跟 ruby 无关。删掉这个字符就行了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号