2017-04-12 51 views
0

的動作經由Ruby的包函數輸出一個固定長度字符串紅寶石包和拉丁(高ASCII)字符

clean = [edc_unico, sequenza_sede, cliente_id.to_s, nome, indirizzo, cap, comune, provincia, persona, note, telefono, email] 
string = clean.pack('A15A5A6A40A35A5A30A2A40A40A18A25') 

但是,數據是在UTF-8,以允許拉丁/高ASCII字符。包行爲的結果是合乎邏輯的。高級ASCII字符佔用2個常規ASCII字符的空間。由此產生的字符串縮短了1個空格字符,擊敗了最初的目的。

什麼是一個簡潔的ruby命令來解釋高ascii字符,並因此爲每個高ascii字符在每個變量的末尾添加一個額外的空間,以便可以將長度引入其正確的目標? (注:我假設沒有指令,專門針對這一點,和一大堆包指令是令人混混)

更新其中基於重音字符第二行移動位置的例子

CNFrigo           539          Via Privata Da Via Iseo 6C           20098San Giuliano Milanese   MI02 98282410       02 98287686  12886480156  12886480156 Bo3     Euro    Giuseppe Frigo Transport 349 2803433                                                                 [email protected] [email protected]  
CNIn's M          497          Via Istituto S.Maria della Pietà,         30173Venezia      Ve041 8690111  340 6311408  0041 5136113  00115180283  02896940273 B60Fm    Euro    Per Documentazioni Tecniche Inviare Materiale A : [email protected] Amministrazione : [email protected] Silvia Scarpa Per Liberatorie 041/5136171 Sig.Ra Bianco Per Pagamento Fatture 041/5136111 (Solo Il Giovedi Pomeriggio Dalle 14 All          [email protected]   
+0

你有'clean'的例子陣列? –

+0

問題上面 – Jerome

+1

更新的「高ASCII,」像「擴展ASCII」,是一種不精確的術語,增加了更多的混亂對您的問題比它的清晰度。如果要引用由UTF-8中的多個字節表示的字符,可以使用一個很好的術語「多字節UTF-8字符」。 –

回答

1

看起來你要使用pack格式化字符串固定寬度列顯示。這不是它的目的,它通常用於將數據打包成固定的字節結構,用於網絡協議等。

你可能想使用的格式字符串,而不是,這是更適合用於顯示操作數據。

看一看String#%(即%方法上字符串)。像pack它使用Kernel#sprintf中定義的另一種小語言。

以一個簡化的例子,其中這兩個陣列:

plain = ["Iseo", "Next field"] 
accent = ["Pietà", "Next field"] 

然後使用pack這樣的:

puts plain.pack("A10A10") 
puts accent.pack("A10A10") 

將產生的結果,看起來像這樣,其中「下一個字段」 ISN」 t自對齊pack正在處理寬度的字節數,而不是顯示寬度

Iseo  Next field 
Pietà Next field 

使用格式字符串,像這樣:

puts "%-10s%-10s" % plain 
puts "%-10s%-10s" % accent 

產生期望的結果,因爲它在處理與顯示寬度:

Iseo  Next field 
Pietà  Next field