Ruby pack и латинские (high-ASCII) символы

Действие выводит строку фиксированной длины через упаковочную функцию 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 занимают пространство 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 ответ

Похоже, вы пытаетесь использовать pack отформатировать строки в столбцы фиксированной ширины для отображения. Это не то, для чего он нужен, он обычно используется для упаковки данных в фиксированные байтовые структуры для таких вещей, как сетевые протоколы.

Вы, вероятно, хотите вместо этого использовать форматную строку, которая лучше подходит для манипулирования данными для отображения.

Посмотри на 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
Другие вопросы по тегам