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