Из соображений кодирования, которые вас ужаснули бы (мне стыдно сказать), мне нужно хранить несколько текстовых элементов в одной строке.
Я выделю их символом.
Какой символ лучше всего использовать для этого, т.е. какой символ с наименьшей вероятностью появится в тексте? Должен быть доступен для печати и, вероятно, меньше 128 в ASCII, чтобы избежать проблем с локалью.
ascii
delimiter
delimited-text
Рахул
источник
источник
|
в своем тексте, у меня действительно был такой случай, когда мне нужно было сократить количество символов до минимума, насколько это возможно. Поскольку в большинстве полей есть строки с интересным текстом, CSV не работал из-за большого количества экранирований. Наш разделитель полей -/|
. Косая черта встречается нечасто, но в сочетании с трубкой, с которой вы никогда не столкнетесь. Я использовал движок, который ежедневно пропускает через него много данных. Это никогда не ломалось, и мне никогда не нужно было инкапсулировать одну строку или экранировать специальный символ. В среднем этот механизм сэкономил нам несколько процентов текста.Ответы:
Предполагая, что по какой-то неловкой причине вы не можете использовать CSV, я бы сказал, что используйте данные. Возьмите несколько примеров данных и выполните простой подсчет символов для каждого значения 0–127. Выберите один из тех, которых не происходит. Если есть слишком большой выбор, возьмите больший набор данных. Написание не займет много времени, и вы получите лучший ответ.
Ответ будет разным для разных проблемных областей, поэтому | (вертикальная черта) часто встречается в сценариях оболочки, ^ - в математических формулах, и то же самое, вероятно, верно для большинства других символов.
Я лично думаю, что пошел бы на | (труба), если есть выбор, но использование реальных данных является наиболее безопасным.
И что бы вы ни делали, убедитесь, что вы разработали схему побега!
источник
additional_attributes
.\t
в качестве разделителя?Я бы выбрал «Разделитель единиц», код ASCII «США»: ASCII 31 (0x1F)
В старые-старые времена большинство вещей делалось серийно, без произвольного доступа. Это означало, что в ASCII было встроено несколько управляющих кодов.
Разделитель единиц находится в ASCII, и есть поддержка Unicode для его отображения (обычно это «нас» в том же глифе), но многие шрифты не отображают его.
Если вы должны отобразить его, я бы рекомендовал отображать его в приложении после того, как он был проанализирован в поля.
источник
Наверное | или ^ или ~ вы также можете объединить два символа
источник
При использовании разных языков этот символ: ¬
оказался лучшим. Однако я все еще тестирую.
источник
Вы сказали «для печати», но это может включать такие символы, как табуляция (0x09) или подача формы (0x0c). Я почти всегда выбираю табуляцию, а не запятую для файлов с разделителями, поскольку запятые иногда могут появляться в тексте.
(Интересно, что в таблице ascii есть символы GS (0x1D), RS (0x1E) и US (0x1F) для разделителей групп, записей и единиц, какими бы они ни были.)
Если под «печатным» вы имеете в виду символ, который пользователь может распознать и легко ввести, я бы выбрал трубу | символ первого, с несколькими другими странными персонажами (
@
или~
или^
или\
или кавычка , которые я не могу войти здесь) как возможность.+=!$%&*()-'":;<>,.?/
Кажется, что эти символы чаще встречаются при вводе пользователем. Что касается подчеркивания,_
хеша#
и скобок,{}[]
я не знаю.источник
28 FS
разделитель файлов, разделитель29 GS
групп, разделитель30 RS
записей, разделитель31 US
единиц. К сожалению, почти никто ими не пользуется, хотя они и предназначены для этого. Лично я ненавижу файлы в формате CSV, потому что многие люди не думают об этом и создают беспорядок, с которым нам, программистам, приходится иметь дело, если мы хотим поддерживать их форматы файлов.Как насчет того, чтобы использовать формат стиля CSV? Символы можно экранировать в стандартном формате CSV, и уже написано множество синтаксических анализаторов.
источник
Вы можете использовать символ трубы? Обычно это следующий по распространенности разделитель после строк, разделенных запятыми или табуляциями. Маловероятно, что большая часть текста будет содержать вертикальную черту, и ord ('|') возвращает 124 для меня, так что, похоже, это соответствует вашим требованиям.
источник
Для быстрого экранирования я использую такие вещи: скажем, вы хотите объединить str1, str2 и str3, что я делаю:
затем восстановить исходное использование:
примечание: порядок замены важен
его нерушимый и простой в реализации
источник
Труба на победу! |
источник
Мы используем ascii 0x7f, который можно использовать для псевдопечати, и он практически никогда не используется.
источник
Это может быть хорошо или плохо (обычно плохо) в зависимости от ситуации и языка, но имейте в виду, что вы всегда можете кодировать Base64 целиком. Тогда вам не нужно беспокоиться об экранировании и отмене экранирования различных шаблонов с каждой стороны, и вы можете просто разделять и разбивать строки на основе символа, который не используется в вашей кодировке Base64.
Мне пришлось прибегнуть к этому решению, когда я столкнулся с помещением XML-документов в свойства / узлы XML. В свойствах вообще не может быть блоков CDATA, а узлы, экранированные, поскольку CDATA, очевидно, не могут иметь внутри других блоков CDATA без нарушения структуры.
Однако CSV, вероятно, лучше для большинства ситуаций.
источник
Что ж, это в некоторой степени будет зависеть от характера вашего текста, но вертикальная полоса 0x7C не часто появляется в тексте.
источник
Я не думаю, что когда-либо видел амперсанд, за которым следует запятая в естественном тексте, но вы можете сначала проверить файл, чтобы увидеть, содержит ли он разделитель, и если да, используйте альтернативу. Если вы хотите всегда знать, что используемый вами разделитель не вызовет конфликта, выполните цикл, проверяющий файл для нужного разделителя, и, если он существует, удвойте строку, пока файл не перестанет соответствовать . Не имеет значения, есть ли похожие строки, потому что ваша программа будет искать только точные совпадения разделителей.
источник
И трубка, и каретка - очевидный выбор. Я хотел бы отметить, что если ожидается, что пользователи будут вводить весь ответ, курсор легче найти на любой клавиатуре, чем канал.
источник