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

备注

字符串、字符集和编码算是刚入门,有机会还得继续学习。

 

转载于:https://www.cnblogs.com/happyframework/p/3275367.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis持久化RDB和AOF区别

RDBRDB是Redis内存到硬盘的快照,用于redis持久化,创建RDB二进制文件,将存储在内存中的数据,持久化的放到硬盘中,当我们需要这些数据的时候,启动载入RDB文件,数据将会被存入内存中,其…

央视力荐的这套书,让5岁孩子看漫画,秒懂物理,学习早“开窍”!

▲ 点击查看今年的高考,不得不说,一度被浙江学霸刷屏!他总分720分,物理等3门满分的成绩,最终获得“浙江高考状元”。状元能摘得桂冠,除了日积月累的不断努力外,最重要的是,不断调整自…

MongoDB基本操作(增删改查)

2019独角兽企业重金招聘Python工程师标准>>> 基本操作 基本的“增删查改“,在DOS环境下输入mongo命令打开shell,其实这个shell就是mongodb的客户端,同时也是一个js的编译器,默认连接的是“test”数据库。 【出错】 首先…

Kubernetes + .NET Core 的落地实践

1容器化背景本来生活网(benlai.com)是一家生鲜电商平台,公司很早就停止了烧钱模式,开始追求盈利。既然要把利润最大化,那就要开源节流,作为技术可以在省钱的方面想想办法。我们的生产环境是由 IDC 机房的 1…

传说中的宇宙最水诺奖得主:本科历史学,却凭借“一纸”博士论文摘取诺贝尔物理学奖,出道即巅峰!...

全世界只有3.14 % 的人关注了爆炸吧知识他,到底是不是最水的诺奖得主?超模君曾经介绍了学历史,最终成为数学、物理大牛的威滕(传送门),然而竟出现了德布罗意姥爷的高分点赞!那今天,超…

基于事件驱动架构构建微服务第13部分:使用来自Apache KAFKA的事件并将投影流传输到ElasticSearch...

原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part13-read-model-projection-project-streams-into-elasticsearch/在本教程中,我将展示如何从KAFKA读取流并将流投影到ElasticSearch中。我必须使用来自KAF…

惊呆了!这篇论文全文都是脏话,可编辑部居然对它评价极佳并发表了!

全世界只有3.14 % 的人关注了爆炸吧知识本文转自:募格学术你见过最奇奇怪怪的论文是什么?一教授为了抗议三流科学杂志发送垃圾邮件,回复了一篇全文只重复七个脏话字眼的论文,可没想到的是,它竟然还被 出!版…

单IP无TMG拓扑Lync Server 2013:前端服务器

在前面的基础架构和活动目录两篇文章中,我们已经准备好了Lync Server的所有环境。其实今天虽然部署的是Lync Server 2013的Preview版,但实际上与我们部署Lync的步骤以及规范是完全一样的,所以大家完全可以抛开Lync Server 2013 Preview版本本…

MySQL学习笔记之五:存储引擎和查询缓存

一、存储引擎1、InnoDB⑴InnoDB是基于聚簇索引建立的,基于主键索引查询时,性能较好;它的辅助索引中必须包含主键列;因此,若表上的索引较多,为节约空间,主键应尽可能小⑵InnoDB支持自适应hash索引…

利用SOS扩展库进入高阶.NET6程序的调试

有时候我们可能想深入到程序的运行核心,去观察下内存分配情况以及堆栈内保存的东东,那么作为编程新贵的底层框架.NET6,又为我们提供了什么可用的观测工具呢?1.SOS 扩展是什么?SOS扩展库是Windows 附带的调试扩展库&…

java--用 * 打印出各种图形(新手请进)

------------------------------------ 代码: public class PrintTriangle { public static void main(String[] args) { System.out.println("左边正三角形"); printTopLeft(5); System.out.println("左边倒三角形&quo…

这种动作片还需要汽车特效?

1 奇奇怪怪的扣分点又增加了▼2 就是活好!(素材来源网络,侵删)▼3 不愧是律师!(素材来源网络,侵删)▼4 成都马拉松惊现美食街!(素材来源网络,侵…

Android之支付宝设计与开发

背景 在移动支付领域,支付宝支付占用巨大份额,根据艾瑞咨询公布的报告数据:2014Q3,支付宝斩获了82.6%的市场份额,在移动支付的霸主地位越来越稳固。财付通支付的发力点在微信支付和手Q支付,在移动支付…

秘境探索之一个.NET 对象从内存分配到内存回收

前方高能预警,新手慎入!不听劝阻者,轻则郁闷堆积,重则生死看淡,对编程失去了念想,对生活失去了幻想!好了,心理强大到NB的可以忽略前方若干警示。为了探索.NET对象的内存分配和回收销…

这五部关于宇宙的神级纪录片,带你探索未知的外太空世界

宇宙之大无奇不有,在你的认知里你又知道多少关于宇宙的事情,如果单单用外星人概括你所对宇宙的认知就真的太片面了,小编今天就带来下面这四部关于宇宙的硬核纪录片,带你真正的去了解关于宇宙的知识,让你遨游在宇宙的知…

Exceptionless服务端+kibana部署实时日志纪要

安装软件列表Exceptionless.4.1.2861.zipelasticsearch-5.6.14.zipkibana-5.6.14-windows-x86.zip安装准备1. 在D盘下创建Exceptionless文件夹2. 拷贝需要安装的软件(参照上面安装软件列表)到Exceptionless文件夹下3. 安装JDK 1.8 (C环境中已经有安装, 步骤忽略)4. …

好心帮男朋友洗衣服,他却要分手??

1 每天一个分手小技巧(via.平民窟公主)▼2 导航最近的加油站(素材来源网络,侵删)▼3 单位停电发的蜡烛(via.蜻蜓队长)▼4 我也不知道原来有人这样穿啊!(素材来源网络&…

Android之如何解决右上角不显示3个点的菜单

之前写过小例子,发现菜单栏右上角的那3个点老是显示不出来,今天终于解决了,不废话,先爆照。 我之前的代码menu_main.xml 文件如下 <menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools&quo…

大型网站架构系列:电商网站架构案例

为什么80%的码农都做不了架构师&#xff1f;>>> #0 系列目录# 大型分布式网站架构大型分布式网站架构技术总结大型网站架构系列&#xff1a;电商网站架构案例#1 电商案例原因# 分布式大型网站&#xff0c;目前看主要有几类1.大型门户&#xff0c;比如网易&#xff…