Чье-то имя или инициалы, и вот именно. Иногда эти подписи определяют блок кода...
//SFD Start
...code...
//SFD End
Как код такое произведение искусства, они должны подписать его! Плюс, что, если кто-то еще должен изменить код, отметило этот путь?
Это не должно быть перепутано с "виной" или "аннотировать" функцию в системах управления исходным кодом - они качаются!
В некоторых проектов, я использую следующую вспомогательную функцию для выполнения чего-то похожего на Python repr для строк:
private static final char CONTROL_LIMIT = ' ';
private static final char PRINTABLE_LIMIT = '\u007e';
private static final char[] HEX_DIGITS = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
public static String toPrintableRepresentation(String source) {
if( source == null ) return null;
else {
final StringBuilder sb = new StringBuilder();
final int limit = source.length();
char[] hexbuf = null;
int pointer = 0;
sb.append('"');
while( pointer < limit ) {
int ch = source.charAt(pointer++);
switch( ch ) {
case '\0': sb.append("\\0"); break;
case '\t': sb.append("\\t"); break;
case '\n': sb.append("\\n"); break;
case '\r': sb.append("\\r"); break;
case '\"': sb.append("\\\""); break;
case '\\': sb.append("\\\\"); break;
default:
if( CONTROL_LIMIT <= ch && ch <= PRINTABLE_LIMIT ) sb.append((char)ch);
else {
sb.append("\\u");
if( hexbuf == null )
hexbuf = new char[4];
for( int offs = 4; offs > 0; ) {
hexbuf[--offs] = HEX_DIGITS[ch & 0xf];
ch >>>= 4;
}
sb.append(hexbuf, 0, 4);
}
}
}
return sb.append('"').toString();
}
}
Ее главное преимущество перед многими другими решениями, приведенными здесь, заключается в том, что она не фильтрует только ограниченный набор непечатаемые символы (например, те, которые заменяют решения на основе ), а просто все непечатаемые символы ASCII. Некоторые из них можно было бы написать немного лучше, но они действительно выполняют свою работу ...
Обратите внимание, что, как и функция Python, этот будет заключать строку в кавычки. Если вы этого не хотите, вам придется исключить вызовы append ('"') до и после цикла while .
Это сработает, но это немного похоже на взлом, он использует StringUtils и replaceEach из Common Lang для простой замены:
String hello = "hello\n\tworld\n\n\t";
String replaced = StringUtils.replaceEach(hello, new String[] {"\n", "\t", "\r", "\f"},
new String[] {"\\n", "\\t", "\\r", "\\f"});
System.out.println("Replaced " + replaced);
не думаю, что есть какой-то конкретный метод, но это решит его без общего языка:
public class test {
public test() throws Exception {
byte[] hello = "hello\n\tworld\n\n\t".getBytes();
System.out.println(new String(hexToByte(stringToHex(hello).replaceAll("0a", "5c6e")
.replaceAll("09", "5c74"))));
}
public static void main(String[] args) throws Exception {
new test();
}
public static String stringToHex(byte[] b) throws Exception {
String result = "";
for (int i = 0; i < b.length; i++) {
result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
}
return result;
}
public static byte[] hexToByte(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));
}
return data;
}
}
Если вы собираетесь использовать это только для строк, в крайнем случае вы могли бы просто написать метод, который перебирает строку и заменяет специальные символы (для любого определения "особого", которое вы хотите) их коды выхода. Я бы так и поступил. (Я провел быстрый поиск и ничего не нашел в Google, так что, возможно, будет быстрее просто написать метод, чем искать существующую реализацию)
в крайнем случае вы можете просто написать метод, который перебирает строку и заменяет специальные символы (для любого определения «особого», которое вы хотите) их escape-кодами. Я бы так и поступил. (Я провел быстрый поиск и ничего не нашел в Google, так что, возможно, будет быстрее просто написать метод, чем искать существующую реализацию) в крайнем случае вы можете просто написать метод, который перебирает строку и заменяет специальные символы (для любого определения «особого», которое вы хотите) их escape-кодами. Я бы так и поступил. (Я провел быстрый поиск и ничего не нашел в Google, так что, возможно, будет быстрее просто написать метод, чем искать существующую реализацию)Если бы такой метод существовал, он упростил бы написание quine на Java, потому что он решил бы проблему выхода из кавычек. Поскольку все простейшие quines в Java требуют ручной вставки символа кавычки вручную с его кодом символа, маловероятно, что такой метод существует.
Похоже, что Jython уже делает это. Теоретически вы можете включить Jython jar, запустить интерпретатор и фактически запустить repr (объект) для рассматриваемого объекта. Наверное, больше накладных расходов, чем вы хотите, но делает именно то, что вы описываете.
Если вы хотите встроить интерпретатор Jython в свое приложение, рассмотрите http://wiki.python.org/jython/JythonFaq/EmbeddingJython .