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

Tonyhong · 发布于 2013年7月26日 · 最后由 seveniruby 回复于 2015年6月03日 · 4837 次阅读
2054

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

共收到 65 条回复
2880

$KCODE 那行改成 # coding: binary ?

2054

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

96

同问

942

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

96

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

2054

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

1173

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

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

487

@Tonyhong Ruby哪个版本, 1.8?

2054

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

487

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

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

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

2054

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

487

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

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

353

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

2622

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

487

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

353
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这类环境变量吧

353

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

# encoding: 'utf-8'
p __ENCODING__

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

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

487

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

2054

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

487

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

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

353

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

2054

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

353

#23楼 @Tonyhong

#encoding: utf-8
p __ENCODING__
96

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

353

#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"
487

#26楼 @cantin 有啥问题?

96

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

487

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

汗!

353

#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
487

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

487

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

487

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

353

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

487

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

487

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

487

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

487

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

4277

有个 Iconv 的gem 可以去试试

487

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

汗!

487

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

4277

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

487

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

353

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

487

#44楼 @cantin

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

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

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

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

353

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

487

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

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

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

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

487

#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>]

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

353

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

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

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

487

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

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

353

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

487

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

7659

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

1342

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

96

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

2452

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

96

试试在文件首行插入:

encoding: utf-8

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

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

这贴,楼主已失踪了。

2054

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

2054

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

': invalid byte sequence in GBK (ArgumentError)

96

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

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

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