IronRuby - 文件编码惹的祸

简介:

使用VS2010的CodedUI来做自己的自动化测试框架中介绍了我将使用IronRuby作为脚本语言来编写自动化测试脚本,但是当时在使用IronRuby编写脚本过程中发现了一个编码导致的问题,在这里给大家介绍一下,大家在编写脚本时一定要主要脚本文件的编码。

问题描述

  我在rb文件中调用了C#的Microsoft.VisualStudio.TestTools.UITesting.dll的查找按钮并单击的功能,但是总是报错,说找不到此控件,但是我在C#代码中编写类似代码是没有问题。出现问题后上网搜索了一下,但是毕竟资源不多,没有任何结果,于是上IronRuby的codeplex网站提交了一个bug,见:encode error? 具体描述如下

 


   
   
I want to use VisualStudio UITest to do my auto UI test, but I don ' t find window and button.
( attachment is Microsoft.VisualStudio.TestTools.UI
Testing.dll )
code:
require
" Microsoft.VisualStudio.TestTools.UITesting.dll "
include Microsoft::VisualStudio::TestTools::UITesting::WpfControls
w
= WpfWindow. new
w.SearchProperties[
" Name " ] = " 你好 " ;
puts w.SearchProperties[
" Name " ]


result: 脛茫潞脙
expect : 你好
  • 为了简化应用,我在C#中建立了一个Application.cs文件,里面有一个Application类,类中有一个test方法,传入一个string参数并直接返回:

 

    public class Application
    {
        public string test(string a)
        {
            return a;
        }
}

  • 使用Notepad++建立main.rb,里面主要就是调用Application.Test方法:puts Application.new.test("你好")

运行后,显示的不是”你好“两个字,而是几个乱码。

分析问题

  我上网搜了一些和字符编码相关的内容,很多都是介绍字符编码转换的,如result = Iconv.iconv("GB2312","UTF-16",a) ,我在rb脚本和C#都试过了多个字符转换的情况,发现仍旧不能正确解析。

  这时我突然想起上周遇到此问题后我给公司的一个Ruby高手请教过的这个问题,以下是邮件主要内容:

  • 标题:Ruby处理Unicode有没有什么问题?
  • 问:我现在用的是.Net下的一个Ruby实现IronRuby,现在遇到一个问题,不知道Ruby中是否也有,问题是:在ironRuby代码中直接hash.new 附上中文没有问题,但是有种情况有问题,有一个.Net类库,它有个类似hash的属性,我在ironRuby代码中给它付了一个中文,但是取出来的时候发现是乱码了,不知是何原因?
  • 回复:ruby1.8里面是没有编码的概念,都是字符序列.所以你给他什么就是什么,他不关心.但是ruby文件有编码,直接决定了你的字符序列的编码.我不知道.net是什么编码的,两边一致应该就可以了.

我提出了一个假设,是不是文件编码导致的?

解决问题

既然提出了假设,接下来就是验证我的假设了。由于我对字符编码不熟悉,于是又上网搜索了一些,了解了以下Utf-8,GB2312等,而C#是支持Unicode的,所以我接着又试了以下几步:

  • 在Notepad++把文件更改为UTF-8的格式,如下图所示:

 







  • 在ir.exe执行中加入参数 -KU
    ir -KU -X:ShowClrExceptions main.rb

再次运行后,发现竟然一切又是那么美好!

问题回顾

  这个问题前后花了我一天时间去解决,总的来说问题相对来说不难,但是需要对Ruby的字符编码有所了解,而我以前没有注意到这个也会引起问题,从解决这个bug过程中,可以有以下几点与大家分享一下:

  1. 遇到陌生问题而自己没有思路时,求助高手是最快速便捷的方法
  2. 解决问题方法之一就是提出假设再验证假设
  3. 使用新技术时,最好系统学习一下,例如我就是花了半天时间看了一下《IronRuby Unleashed.pdf》一书才知道ir.exe的 参数-KKcode了,否则我更改了文件编码也未必会想到增加ir.exe的参数
  4. 知识点:文件编码直接影响ruby的字符编码





 本文转自 jingen_zhou 51CTO博客,原文链接:http://blog.51cto.com/zhoujg/518033,如需转载请自行联系原作者

相关文章
|
安全 Java Maven
最小化 Java 镜像的常用技巧
随着容器技术的普及,越来越多的应用被容器化。人们使用容器的频率越来越高,但常常忽略一个基本但又非常重要的问题 - 容器镜像的体积。本文将介绍精简容器镜像的必要性并以基于 spring boot 的 java 应用为例描述最小化容器镜像的常用技巧。
4789 0
|
安全 Shell 网络安全
【服务器】Xshell与Xftp软件的使用指南
【服务器】Xshell与Xftp软件的使用指南
1518 0
|
10月前
|
机器学习/深度学习 人工智能 算法
基于蓝牙室内定位技术的院内智能导航系统
本文介绍了一款基于蓝牙室内定位技术的院内智能导航系统。该系统通过高精度定位与智能路径规划,极大提升了患者就医体验与医院运营效率。如需获取智慧医院院内导航系统技术文档可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~
393 1
|
开发者 UED Ruby
Ruby中的异常处理之谜:如何用异常与rescue让你的代码坚不可摧?
【8月更文挑战第31天】在软件开发中,错误处理对应用稳定性至关重要。作为动态、面向对象的语言,Ruby提供了丰富的错误处理机制,如异常与rescue。本文通过示例代码介绍了Ruby中的异常类型、异常链及rescue与else的使用,展示了如何优雅地处理各种错误情况,增强了程序的健壮性和用户体验。使用这些机制,开发者能更精准地识别并解决运行时问题,提升应用质量。随着Ruby生态的发展,错误处理的重要性将愈发凸显。
268 1
|
负载均衡 监控 Kubernetes
Service Mesh 是一种用于处理服务间通信的基础设施层,它通常与微服务架构一起使用,以提供诸如服务发现、负载均衡、熔断、监控、追踪和安全性等功能。
Service Mesh 是一种用于处理服务间通信的基础设施层,它通常与微服务架构一起使用,以提供诸如服务发现、负载均衡、熔断、监控、追踪和安全性等功能。
|
JavaScript
|
监控 安全 网络协议
什么是udp攻击,为什么udp攻击这难防御
UDP是无连接的传输协议,常用于需要速度但不要求可靠性的场景,如DNS查询、流媒体等。UDP Flood是DDoS攻击的一种,通过大量伪造的UDP报文消耗目标带宽,可能导致网络瘫痪。防御UDP Flood包括限流、静态指纹过滤和动态指纹学习。应用加速技术提供抗DDoS、CC防护、环境安全检测等功能,通过隐藏真实IP、加密传输和智能调度增强安全性。
|
前端开发
vue3 【提效】使用 CSS 框架 UnoCSS 实用教程
vue3 【提效】使用 CSS 框架 UnoCSS 实用教程
1009 1
|
存储 人工智能 搜索推荐
持续打通中国CRM SaaS生态,阿里云上的Salesforce稳步“着陆”
持续打通中国CRM SaaS生态,阿里云上的Salesforce稳步“着陆”
|
前端开发
招聘求职系统|基于Springboot+Vue+Nodejs实现求职招聘系统(三)
招聘求职系统|基于Springboot+Vue+Nodejs实现求职招聘系统
285 0
招聘求职系统|基于Springboot+Vue+Nodejs实现求职招聘系统(三)

热门文章

最新文章