1. 获取编码
- 用 String#encoding 方法可获取字符串的编码,用伪变量 _ENCODING_ 可获取当前运行脚本的编码
2. encode 和 force_encoding区别
- encode假设当前编码是正确的,并尝试更改字符串,使其在第二次编码中以相同的方式读取
- force_encoding设置给定的字符串编码,但不改变字符串本身,即不改变它在内存中的表示
- force_encoding改变字符串从字节读取的方式,而encode改变字符串写入的方式而不改变输出(如果可能)
'łał'.bytes #=> [197, 130, 97, 197, 130]
'łał'.force_encoding('UTF-16').bytes #=> [197, 130, 97, 197, 130]
'łał'.force_encoding('UTF-16') #=> "\xC5\x82\x61\xC5\x82"
'łał'.encode('UTF-16').bytes #=> [254, 255, 1, 66, 0, 97, 1, 66]
'łał'.encode('UTF-16') #=> "\uFEFF\u0142a\u0142"
3. 解析字符串
string = "R\xC3\xA9sum\xC3\xA9"
string.force_encoding('UTF-8') #=> "Résumé"
string.encode('UTF-8') #=> "Résumé"
require 'cgi'
CGI::unescape(string) #=> "Résumé"
4. Encoding 类的方法
Encoding.default_external
返回默认的外部编码,这个值会影响 IO 类的外部编码
Encoding.default_internal
返回默认的内部编码,这个值会影响 IO 类的内部编码
Encoding.list Encoding.name_list
返回 Ruby 支持的编码一览表
p Encoding.list
#=> [#<Encoding:ASCII-8BIT>, #<Encoding:UTF-8>, ...
p Encoding.name_list
#=> ["ASCII-8BIT", "UTF-8", "US-ASCII", ...