Ruby编码
目录
背景字符串可以使用不同的编码编码转换编码强制不同编码的字符串相加后是啥结果?一直没使用过的\u和\x使用Sublime开发Ruby时,输出到控制台的字符串为啥不能使用多种编码?备注
背景返回目录
Ruby直到1.9版本才很好的支持了多字节编码,本文简单总结了今天学习的关于Ruby编码方面的知识。
字符串可以使用不同的编码返回目录
在.NET中字符串的编码是一致的,Ruby允许字符串有不同的编码,当时我就在想:如果两个不同编码的字符串相加会出现什么结果?
测试程序

- 1 # coding: utf-8
- 2
- 3 str_utf8 = "hi 段"
- 4 puts str_utf8.size # 4
- 5 puts str_utf8.bytesize # 6
- 6 puts str_utf8 .encoding # UTF-8
- 7 str_utf8.each_byte {|b| print "%02X," % [b]} # 68,69,20,E6,AE,B5,
- 8 puts
- 9
- 10 puts
- 11
- 12 str_gb2312 = "hi 段".encode("gb2312")
- 13 puts str_gb2312.size # 4
- 14 puts str_gb2312.bytesize # 5
- 15 puts str_gb2312 .encoding # GB2312
- 16 str_gb2312.each_byte {|b| print "%02X," % [b]} # 68,69,20,B6,CE,
- 17 puts

输出结果

- 1 4
- 2 6
- 3 UTF-8
- 4 68,69,20,E6,AE,B5,
- 5
- 6 4
- 7 5
- 8 GB2312
- 9 68,69,20,B6,CE,

备注:UTF-8对英文采用1个字节,对中文采用三个字节。GB2312对英文采用1个字节,对中文采用两个字节。
编码转换返回目录
编码转换可以采用String::encode("目标编码名称")来完成,如果编码之间的转换兼容,返回编码后的字符串,否则会抛出编码转换异常。
测试程序

- 1 begin
- 2 puts "段".encode("ascii")
- 3 rescue Exception => e
- 4 puts e.class
- 5 end
- 6
- 7 puts "段".encode("gb2312")

输出结果

- 1 Encoding::UndefinedConversionError
- 2 段

备注:encode会返回一个和元字符串序列一样的字符串序列,只是内部的字节序列改变了。
编码强制返回目录
编码强制是指在不改变字节序列的情况下改变对字节的解释方式,编码强制:String::force_encoding("强制编码")。
测试程序

- 1 utf8_str = "\xE6\xAE\xB5".encode("utf-8")
- 2 puts utf8_str.encoding() # UTF-8
- 3 puts utf8_str.size # 1
- 4 puts utf8_str.bytesize # 3
- 5
- 6 ascii_str = "\xE6\xAE\xB5".force_encoding("ascii")
- 7 puts ascii_str.encoding() # US-ASCII
- 8 puts ascii_str.size # 3
- 9 puts ascii_str.bytesize # 3
- 10 puts ascii_str.valid_encoding? # false

输出结果

- 1 UTF-8
- 2 1
- 3 3
- 4 US-ASCII
- 5 3
- 6 3
- 7 false

备注:String::valid_encoding?可以判定是否是有效的强制。
不同编码的字符串相加后是啥结果?返回目录
这个问题的答案很简单:如果两个字符串的编码兼容,则返回字符集最大的编码,否则跑出不兼容异常。你可以自己检查兼容性:Encoding.compatible?。
测试程序

- 1 str_ascii = "hi ".encode("ascii")
- 2 str_utf8 = "段"
- 3 puts str_ascii.encoding
- 4 puts str_utf8.encoding
- 5 puts Encoding.compatible?(str_ascii.encoding, str_utf8.encoding)
- 6 puts (str_ascii + str_utf8).encoding
- 7 puts (str_utf8 + str_ascii).encoding

运行结果

- 1 US-ASCII
- 2 UTF-8
- 3 UTF-8
- 4 UTF-8
- 5 UTF-8

一直没使用过的\u和\x返回目录
几乎所有的语言都支持这两个转义字符,允许我们使用\uXXXX指定Unicode码点对于的字符,通用也运行我们使用\xXX指定字节。
测试程序

- 1 puts "段" # 段
- 2 puts "\xE6\xAE\xB5" # 段
- 3 puts "\u6BB5" # 段

输出结果

- 1 # 段
- 2 # 段
- 3 # 段

使用Sublime开发Ruby时,输出到控制台的字符串为啥不能使用多种编码?返回目录
测试程序

- 1 puts "段"
- 2 puts "段".encode("GB2312")

在Sublime中的输出结果

- 1 [Decode error - output not utf-8]

在控制台的输出结果
原因分析
Sublime之所以失败是因为Sublime重定位了默认标准输出流,而重定位后的流不支持混合多种编码,说白了:你没法在一个文件中保存两种编码的字符串。
备注:Sublime中的失败不是Ruby导致的,是Sublime自身的问题。
如何解决?
Sublime默认只能接收UTF8编码,因此必须转换为UTF8编码。

- 1 # 默认是UTF8编码,不用处理。
- 2 puts "段"
- 3 # 执行windows命令必须使用GB2312编码。
- 4 command = "echo 段".encode("GB2312")
- 5 # 命令执行的结果想输出到Sublime必须使用UTF8编码。
- 6 puts `#{command}`.encode("utf-8")

输出结果

- 1 # 输出结果
- 2 段
- 3 段

备注返回目录
字符串、字符集和编码算是刚入门,有机会还得继续学习。
Ruby编码的更多相关文章
- 3-22 Ruby 编码规则(个人整理)
编码规则 https://github.com/thoughtbot/guides/tree/master/style/ruby *Use a trailing comma after each it ...
- ruby编码说明
程序编码一般分几种情况: 1.源码文件编码 2.接收外部内容的编码 3.运行环境编码 4.操作系统编码 首先源码文件的编码,可以通过在ruby文件的头部添加一行申明即可,这样所有在源码里面出现的字符都 ...
- Ruby:字符集和编码学习总结
背景 Ruby直到1.9版本才很好的支持了多字节编码,本文简单总结了今天学习的关于Ruby编码方面的知识. 字符串可以使用不同的编码 在.NET中字符串的编码是一致的,Ruby允许字符串有不同的编码, ...
- 雷林鹏分享:Ruby JSON
Ruby JSON 本章节我们将为大家介绍如何使用 Ruby 语言来编码和解码 JSON 对象. 环境配置 在使用 Ruby 编码或解码 JSON 数据前,我们需要先安装 Ruby JSON 模块.在 ...
- Unix 下 使用 RVM 管理 Ruby 和 gem
转载:http://www.ibm.com/developerworks/cn/aix/library/au-aix-manage-ruby/ 尽管 Internet Relay Chat.论坛和 ...
- RubyMine 2017.3.2破解教程
下载地址:http://www.3322.cc/soft/35519.html RubyMine 2017.3.2破解版是一款专为Ruby和Rails开发者准备的IDE(被誉为最智能的Ruby和Rai ...
- HBase-1.2.1和Phoenix-4.7.0分布式安装指南
目录 目录 1 1. 前言 2 2. 概念 2 2.1. Region name 2 3. 约定 2 4. 相关端口 3 5. 下载HBase 3 6. 安装步骤 3 6.1. 修改conf/regi ...
- webstorm中sass编译时目录或内容包含中文字符报错
ruby版本:ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-mingw32] sass版本:Sass 3.4.22 (Selective Steve) ...
- 在Hadoop-3.1.2上安装HBase-2.2.1
目录 目录 1 1. 前言 3 2. 缩略语 3 3. 安装规划 3 3.1. 用户规划 3 3.2. 目录规划 4 4. 相关端口 4 5. 下载安装包 4 6. 修改配置文件 5 6.1. 修改策 ...
随机推荐
- 【百度地图API】如何获取行政区域的边界?
原文:[百度地图API]如何获取行政区域的边界? 摘要:以前教过大家如何自行获取行政区域,或者自定义获取一个区域的边界值.今天来教大家直接调用百度地图API1.3(目前最新版本)来获取行政区域的边界值 ...
- linux系统管理命令--系统测试工具
1.tcpdump -n 使用IP地址表示主机,而不是主机名的:使用数字port号码,而不是服务名 -i 指定要监听的网卡接口, "-i any"表示抓取全部网卡接口上的数 ...
- 音乐TV2015校园招聘A第二大发行量(对中国科学院大学站)
标题叙述性说明:鉴于阵列A,尺寸n,数组元素1至n数位,但是,一些数字多次出现,有些数字不出现.请设计算法和程序.统计数据不会出现什么.什么号码多次出现. 您可以O(n)时间复杂度,O(1)求下完毕么 ...
- ASP.NET 5 :读写数据库连接字符串
ASP.NET 5 :读写数据库连接字符串 1.概述 ASP.NET 5模板项目配置文件采用了JSON格式,你依然可以采用以前的xml格式.C#对web.config或app.config读写及加密有 ...
- 使用C语言编写windows服务一般框架
原文:使用C语言编写windows服务一般框架 编写windows服务和编写windows应用程序一样,有一些回调函数必须填写且向windows 服务管理器(service manager)进行注册, ...
- Hibernate实体映射配置(XML)简单三步完美配置
我们在使用Hibernate框架的时候,非常纠结的地方就是实体和表之间的映射,今天借助汤老师的思路写了小教程,以后配置不用纠结了! 第一步:写注释 格式为:?属性,表达的是本对象与?的?关系. 例:“ ...
- 浅析 JavaScript 中的 函数 currying 柯里化
原文:浅析 JavaScript 中的 函数 currying 柯里化 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字 ...
- jQuery圆形统计图实战开发
今天我给大家介绍一款圆形统计图circliful,它基于HTML5的画布和jQuery,无需使用图像轻松实现圆形统计图,而且有很多属性设置,使用起来非常方便. 首先我们需要将jquery库文件和jqu ...
- QT自动补全设置
在工具 -> 选项 -> 环境 -> 键盘 中,找到TextEditor -> CompleteThis,修改后面的快捷键就好了 我将它修改为Alt + /
- HubbleDotNet全文搜索数据库组件(二)
[摘要]本文介绍如何使用HubbleDotNet实现基本的全文搜索,包括建立搜索数据库.数据表.建立索引,压缩索引和搜索示例等内容. 上文介绍了HubbleDotNet的安装,接下来介绍如何使用Hub ...