【问题标题】:Ruby pack and Latin (high-ASCII) charactersRuby 包和拉丁文(高位 ASCII)字符
【发布时间】:2017-04-12 07:35:09
【问题描述】:

一个动作通过 Ruby 的 pack 函数输出一个固定长度的字符串

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

但是,数据采用 UTF-8 格式,以允许使用 latin/high-ascii 字符。打包操作的结果是合乎逻辑的。高 ascii 字符占用 2 个常规 ascii 字符的空间。结果字符串被缩短了 1 个空格字符,违背了最初的目的。

什么是简洁的 ruby​​ 命令来解释高 ascii 字符,从而在每个变量的末尾为每个高 ascii 字符添加一个额外的空格,以便可以将长度带到正确的目标? (注意:我假设没有专门解决这个问题的指令,而且所有的 pack 指令都令人费解)

更新第二行根据重音字符移动位置的示例

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           

【问题讨论】:

  • 你有clean数组的例子吗?
  • 上面更新的问题
  • “High-ASCII”,如“扩展 ASCII”,是一个不精确的术语,它给您的问题带来的混乱多于它的清晰度。如果要引用在 UTF-8 中由多个字节表示的字符,一个很好的术语是“多字节 UTF-8 字符”。

标签: ruby utf-8 pack


【解决方案1】:

您似乎正在尝试使用pack 将字符串格式化为固定宽度的列以进行显示。这不是它的用途,它通常用于将数据打包成固定的 byte 结构,用于网络协议等。

您可能想改用格式字符串,它更适合处理数据以进行显示。

查看String#%(即字符串上的% 方法)。与pack 一样,它使用另一种在Kernel#sprintf 中定义的小语言。

举一个简化的例子,有两个数组:

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

然后像这样使用pack

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

将产生如下所示的结果,其中“下一个字段”未对齐,因为pack 处理的是以字节为单位的宽度,而不是显示的宽度

Iseo      Next field
Pietà    Next field

使用格式字符串,如下所示:

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

产生所需的结果,因为它正在处理可显示的宽度:

Iseo      Next field
Pietà     Next field

【讨论】:

    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多