Ruby包和拉丁语(高ASCII)字符

时间:2017-04-12 07:35:10

标签: ruby utf-8 pack

动作通过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           

1 个答案:

答案 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