Хм, из твоего вопроса, я не совсем ясен в этом вопросе, но, так как ты хотел какого-то преобразования, я предполагаю, что ты хочешь что-то, что, по крайней мере, читается человеком?
Каждая ОС может иметь свои ограничения, но достаточно ли вы близки к платформам, чтобы вы могли узнать / проверить, что приемлемо для имени пользователя? Если бы вы могли найти три «специальных» символа, которые вы могли бы использовать только для замены на '@', '.', '_'
, вам было бы хорошо пойти. (Это всеобъемлющее? Если нет, то вам нужно убедиться, что вы знаете все из них, иначе вы можете столкнуться.) Я немного искал, пытаясь выяснить, существует ли стандарт POSIX, но не смог ничего найти, вот почему Я думаю, что если вы можете просто проверить, что действительно, это будет самый прямой путь.
Даже с одним специальным символом вы можете выполнить кодировку URL-адреса, либо с помощью «%», если он доступен, либо с любым другим, если вы не выберите, скажем «!», Затем { '@'->'!40", '_'->'!5F', '.'-> '!2E' }
. (Спецификация [RFC1738] http://www.rfc -editor.org / rfc / rfc1738.txt ) определяет символы как US-ASCII, поэтому вы можете просто найти таблицу, например, в статье ASCII Википедии и найти правильные шестнадцатеричные цифры там.) Или, вы можете просто сделать свое собственное простое отображение, так как вам не нужен весь набор ASCII, вы можете просто сделать карту с двумя символами для каждого экранированного символа и иметь, скажем, '!a','!u','!p'
для at, подчеркивания, точки .
Если у вас есть два специальных символа, скажем, «%» и «!», Вы можете разделить текст, который представляет символ, скажем, %at!
, &us!
и '&pd!'
. (Это в значительной степени кодировка в стиле html, но вместо '&' и ';' вы используете доступные и создаете свою собственную мнемонику.) Другая идея заключается в том, что вы можете использовать серии символов для определить переведенный символ, где каждый новый символ меняется, какой символ используется. (Это удобно останавливает выполнение, если нам нужно поместить два запрещенных символа рядом друг с другом.) Итак, предположим, что «%» и «!», С периодом 1, подчеркиванием 2 и знаком-знаком, равным трем, 'mickey._sample_@fake.out'
станет 'mickey%!!sample%%!!!fake%out'
. Существуют и другие варианты, но этот код легко кодировать.
Если ни одна из этих опций не является опцией (например, вообще нет символов, просто [a-zA-Z0-9]), то на самом деле я думаю, что ответ Base64 звучит правильно. На самом деле, когда мы добираемся до чего-то другого, кроме простой замены (и даже этого), уже становится трудно печатать, если это цель. Но если вам действительно нужно, чтобы электронная почта была в основном читабельной, то вы делаете что-то вроде экранирования. Я думаю, использовать «0» в качестве escape-символа, поэтому теперь «0» становится «00», «@» становится «01», «.» становится «02», а «_» становится «03». Так что теперь 'mickey01._sample_@fake.out'
станет 'mickey0010203sample0301fake02out'
. Не красиво, но это должно работать; так как мы избежали любых необработанных нулей, просто убедитесь, что вы определили отображение для того, что вы выбрали в качестве escape-символа, и у вас все будет хорошо ..
Это все, что я могу придумать. :) Определенно, если нет необходимости, чтобы эти имена пользователей были доступны для чтения в сыром виде, кажется, что, очевидно, Base64 не будет работать, так как он может создавать косые черты. Черт, ладно, просто двухзначное шестнадцатеричное значение US-ASCII для каждого символа, и все готово ...] - хороший путь; для этого есть множество хороших отлаженных, тщательно протестированных в полевых условиях кодов, и он довольно легко решает вашу проблему. :)