动作通过Ruby的包函数
输出一个固定长度的字符串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 M.Gianoli@Delanchy.Fr S.Galliard@Delanchy.Fr
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 : Silvia_Scarpa@Insmercato.It Amministrazione : Michela_Bianco@Insmercato.It Silvia Scarpa Per Liberatorie 041/5136171 Sig.Ra Bianco Per Pagamento Fatture 041/5136111 (Solo Il Giovedi Pomeriggio Dalle 14 All Beniservizi.Insmercato@Pec.Gruppopam.It
答案 0 :(得分:1)
看起来您正在尝试使用pack
将字符串格式化为固定宽度列以供显示。这不是它的用途,它通常用于将数据打包成固定的字节结构,用于网络协议等。
您可能希望使用格式字符串,这更适合处理数据以进行显示。
查看String#%
(即字符串上的%
方法)。与pack
一样,它使用另一种在Kernel#sprintf
中定义的小语言。
以简化为例,使用两个数组:
plain = ["Iseo", "Next field"]
accent = ["Pietà", "Next field"]
然后像这样使用pack
:
puts plain.pack("A10A10")
puts accent.pack("A10A10")
将生成一个看起来像这样的结果,其中“Next field”未对齐,因为pack
正在处理宽度(以字节为单位),而不是显示的宽度< / EM>:
Iseo Next field
Pietà Next field
使用格式字符串,如下所示:
puts "%-10s%-10s" % plain
puts "%-10s%-10s" % accent
产生所需的结果,因为它处理可显示的宽度:
Iseo Next field
Pietà Next field