文章目錄
在使用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高手請教過的這個問題,以下是郵件主要內容:
- 問:我現在用的是.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過程中,可以有以下幾點與大家分享一下:
- 遇到陌生問題而自己沒有思路時,求助高手是最快速便捷的方法
- 解決問題方法之一就是提出假設再驗證假設
- 使用新技術時,最好系統學習一下,例如我就是花了半天時間看了一下《IronRuby Unleashed.pdf》一書才知道ir.exe的 參數-KKcode了,否則我更改了檔案編碼也未必會想到增加ir.exe的參數
- 知識點:檔案編碼直接影響ruby的字元編碼
歡迎轉載,轉載請註明:轉載自周金根 [ http://zhoujg.cnblogs.com/ ]