中文支持怎么处理。求帮忙解决。。
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 这类环境变量吧
#17 楼 @cantin 那是通过-E 参数设置的,Ruby1.9 开始,IO 也有编码了 http://www.ruby-doc.org/core-2.0/IO.html#method-i-external_encoding
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
保持一致。
#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
#31 楼 @blackanger 应该是改变源代码编码,告诉 ruby 用什么编码方式读取这个源代码文件 LZ 的错误是在第三行,应该就是有中文的那一行,是在 ruby 不能解析这个字符,所以出错了
@cantin 不是的,源码编码是指他那段程序的编码。用#encoding:utf-8 指定。可以使用那个 encoding 变量来查看。读取文件还是 IO 的编码问题。 你可以查一下相关资料。你对源码编码是不是理解错了呢。
#6 楼 @Tonyhong LZ 再上图吧,需要提示的说 #29 楼 @blackanger 外部编码是 default_external,是从环境变量取得的,你说的是 ruby 自身读取源代码所用的编码方式
这么说吧:Ruby1.9 开始有三种默认编码,一种是源码编码。另外一种是 IO 对象编码,因为 IO 对象编码分为内部编码和外部编码,所以说是有三种默认编码。
网上有很多资料,你可以看看。看完以后再来讨论。 和环境变量有什么关系? 当然你强行使用了-E 参数去设置 Ruby1.9 的 IO 默认编码我有啥办法:
The default external encoding is initialized by the locale or -E option.
但是你要明白, -E 设置的和 IO 的默认外部编码,是同一个东西。
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)
@Tonyhong 代码规范:URL 禁止出现字母、斜线、冒号,数字之外的任何字符。 从 URL 分析,楼主用 Windows。 首先,Windows 在中国大陆默认的系统编码是 GBK,而 Web 事实上的编码是 UTF-8; 此外,还有可能出现 UTF-8 或者 GBK 所没有的字符。 因此,即使你改好了,换个操作系统和其它国家地区的语言,还可能出现编码问题。 解决方案:不要在 URL 中出现非法字符。
ruby2.0 没有问题。。。ruby1.9 不晓得是不是因为楼主的编辑器字符集不是 UTF-8。导致打出的路径本来就不是 utf-8 编码。所以解析错误。我在 windows 下试过,没有这个问题。
试试在文件首行插入:
对于你的代码,有 2 个地方,本人不是很认同(不认同的别喷,只是本人的意见):
候用正则表达式提取文件中的一些字符串的时,log 中有汉字和字符数字。结果报错了。 `
': invalid byte sequence in GBK (ArgumentError)这个问题你们讨论了一个月了,我真是无语了。
根源是因为 windows 在写文件的时候,会在文件投入插入一个\xFEFF 如果你保存了 json, 那么用 json parse 解析是会报错的。 跟 ruby 无关。删掉这个字符就行了。