目录

背景字符串可以使用不同的编码编码转换编码强制不同编码的字符串相加后是啥结果?一直没使用过的\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编码的更多相关文章

  1. 3-22 Ruby 编码规则(个人整理)

    编码规则 https://github.com/thoughtbot/guides/tree/master/style/ruby *Use a trailing comma after each it ...

  2. ruby编码说明

    程序编码一般分几种情况: 1.源码文件编码 2.接收外部内容的编码 3.运行环境编码 4.操作系统编码 首先源码文件的编码,可以通过在ruby文件的头部添加一行申明即可,这样所有在源码里面出现的字符都 ...

  3. Ruby:字符集和编码学习总结

    背景 Ruby直到1.9版本才很好的支持了多字节编码,本文简单总结了今天学习的关于Ruby编码方面的知识. 字符串可以使用不同的编码 在.NET中字符串的编码是一致的,Ruby允许字符串有不同的编码, ...

  4. 雷林鹏分享:Ruby JSON

    Ruby JSON 本章节我们将为大家介绍如何使用 Ruby 语言来编码和解码 JSON 对象. 环境配置 在使用 Ruby 编码或解码 JSON 数据前,我们需要先安装 Ruby JSON 模块.在 ...

  5. Unix 下 使用 RVM 管理 Ruby 和 gem

    转载:http://www.ibm.com/developerworks/cn/aix/library/au-aix-manage-ruby/   尽管 Internet Relay Chat.论坛和 ...

  6. RubyMine 2017.3.2破解教程

    下载地址:http://www.3322.cc/soft/35519.html RubyMine 2017.3.2破解版是一款专为Ruby和Rails开发者准备的IDE(被誉为最智能的Ruby和Rai ...

  7. 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 ...

  8. webstorm中sass编译时目录或内容包含中文字符报错

    ruby版本:ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-mingw32] sass版本:Sass 3.4.22 (Selective Steve) ...

  9. 在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. 修改策 ...

随机推荐

  1. Appium:通过wifi连接Android设备

    1.首先用USB连接你的Android设备,然后在终端运行命令,它可以启动设备的5555端口使其在网络上可以连接. adb tcpip 2.现在断开USB连接,然后确保设备和你的电脑连接同一个无线网络 ...

  2. struts2的Action该方法不能去

    最近做的一个特征,使用struts2,input标签内容,并与相应的内容背景的实体类,当提交方法,无法进入action该方法和程序没有报错被,检验N通方法还没有找到,查找终于找到了,它是input标签 ...

  3. Socket 学习(一)

    本次项目增加的引用using System.Net; using System.Net.Sockets; using System.Threading; TextBox.CheckForIllegal ...

  4. 网站静态化处理—web前端优化—上

    网站静态化处理—web前端优化—上(11) 网站静态化处理这个系列马上就要结束了,今天我要讲讲本系列最后一个重要的主题web前端优化.在开始谈论本主题之前,我想问大家一个问题,网站静态化处理技术到底是 ...

  5. 数据泵expdp,impdp使用结

    EXPDP,IMPDP远程导出,导入数据库到本地 1.本地建立导出用户hr_exp并全然删除机hr的用户 C:\Users\Administrator>sqlplus / as sysdba S ...

  6. SQL点滴5—产生时间demention,主要是时间转换

    原文:SQL点滴5-产生时间demention,主要是时间转换 数据仓库中有时间表,存储时间信息,这个存储过程接收开始时间结束时间,写入时间具体信息.有高手用excel函数功能很快能产生INSERT语 ...

  7. Windows下Oracle不显示中文[已解决]

    跟着视频学习,然后讲到插入的时候有中文性别,就GG了,该显示中文的时候都是问号,觉得应该是编码的问题. 于是上网找了下,测试可行,方法如下 1,查询Oracle编码的语句: [sql] SELECT ...

  8. Keil中使用宏编译来定义DEBUG输出

    使用宏编译来格式化调试信息,是一个不错的方法,即可以在需要的时候打印出信息,还可以格式化我们所需要的输出. #define DEBUG 1 #if (DEBUG == 1) #define DBG(A ...

  9. 1cocos2dx扩展UI控制,CCControlSlider,CCScale9Sprite(九妹图。),CCControlSwitch,CCControlButton

     UI控件来自cocos2dx的扩展库.完好了UI方面的元素,使cocos2dx更加丰富多彩.使用扩展库需包括: #include "cocos-ext.h" USING_NS ...

  10. 让你的ubuntu串口程序可以直接读写串口

    默认的情况下,如果我们使用一般用户去打开串口的话会出现 open failed 的错误 这个时候你可以在执行打开串口时加一个sudo,但每次这么需要这么干实在是太麻烦了. 这有一个方法可以跳过以超级用 ...