2011-05-03 70 views
1

任何人都足以在Excel 2011,Ruby 1.9.2/Sintra和字符编码中处理VBA吗?解释来自Mac Excel 2011的Sinatra中的非拉丁字符

我有一个Mac VBA脚本向Ruby Sinatra Web应用程序发出请求。我从Excel传递的文本包含字符,如é。不幸的是,红宝石(版本1.9.2)在这些字符上凄惨地窒息,因为Excel不会以UTF-8格式发送它们。

# encoding: utf-8 
require 'rubygems' 

require 'sinatra' 
require "sinatra/reloader" if development? 

configure do 
    class << Sinatra::Base 
    def options(path, opts={}, &block) 
     route 'OPTIONS', path, opts, &block 
    end 
    end 
    Sinatra::Delegator.delegate :options 
end 

options '/' do 
    response.headers["Access-Control-Allow-Origin"] = "*" 
    response.headers["Access-Control-Allow-Methods"] = "POST" 

    halt 200 
end 

post '/fetch' do 
    chars = [] 
    params['excel_input'].valid_encoding? #returns false 
    params['excel_input'] 
end 

而我的Excel VBA如下:

Sub FetchAddress() 
    For Each oDest In Selection 
     With ActiveSheet.QueryTables.Add(Connection:="URL;http://localhost:4567/fetch", Destination:=oDest) 
     .PostText = "excel_input=" & oDest.Offset(0, -1).Value 
     .RefreshStyle = xlOverwriteCells 
     .SaveData = True 
     .Refresh 
     End With 
    Next 
End Sub 

字符E出来的另一端为z。

SNIP 它看起来像Excel中的文本编码为窗口1252 http://en.wikipedia.org/wiki/Windows-1252 END SNIP

它看起来像红宝石认为,文字是windows 1252,因此Ž的打印。

该字符的字节表示是142(或在Windows-1252中)。问题是我不知道首先从Excel发送给我的编码。

回答

1

iconv可以将输入转换为UTF-8。它将字符编码从一种编码转换为另一种编码。所以这样的事情应该工作:

require "iconv" 
... 
post '/fetch' do 
    excel_input = Iconv.conv("UTF-8", "WINDOWS-1252", params['excel_input']) 
    ... 
end 
+0

它不喜欢它。我认为问题在于进入的文本不是windows-1252 ......我不知道它是以什么编码进来的。 – ewalk 2011-05-03 11:57:59

+0

上面代码中的两个问题:1. UTF8应该是UTF-8 2.参数的顺序应该是TO,FROM。 – ewalk 2011-05-03 13:11:46

+0

这足够接近我让我需要的东西。我发现输入的内容是MACROMAN。唉,我仍然无法正确打印回Excel。 – ewalk 2011-05-03 13:24:23