我没有看到错误。 (Mailto 的转换代码)

I don't see the mistake. (Conversion code for Mailto)

我的意图是为 mailto 转换一个字符串,但是我发现了一个问题,当我设置 breakline 时全部删除并只设置最后一行。

public String mailto(String texto){
    String total="";

    for (int i = 0; i < texto.length(); i++)
        if (texto.charAt(i)!=' ' && texto.charAt(i)!='\n'{
            total += texto.charAt(i);
        } else {
            if(texto.charAt(i)==' ') {
                total = total + "%20";
            } else {
                if(texto.charAt(i)=='\n'){
                    total = total + "%0D%0A";
                }
            }
        }
    }
    return total
}
public String mailto(String texto){
    String total="";

    for (int i = 0; i < texto.length(); i++)
        if(texto.charAt(i)==' ') {
            total = total + "%20";
        } else if(texto.charAt(i)=='\n'){
            total = total + "%0D%0A";
        } else {
            total += texto.charAt(i);
        }
    }
    return total
}

为了减少测试次数,您可以反转逻辑:首先检查 ' ''\n'

不要hand-rollURL编码(很容易出错!),使用现有的URLEncoder

public String mailto(String texto) {
    return URLEncoder.encode(texto);
}

请注意,这会产生略有不同(但有效)的结果:space 被编码为 + 而不是 %20

如果出于某种原因您 want/need 编写自己的 ad-hoc 电子邮件编码器,您可以使用 String.replace:

来缩短您的代码
public String mailto(String texto) {
    return texto.replace(" ", "%20").replace("\n", "%0D%0A");
}

如果您关心性能(实际测量时要小心!),请不要通过连接构造字符串,而是使用 StringBuilder

连同您的代码修复以及为提高可读性而进行的轻微重写,这会产生

public String mailto(final String texto) {
    final StringBuillder sb = new StringBuilder();

    for (int i = 0; i < texto.length(); i++) {
        final char c = texto.charAt(i);
        if (c == ' ') {
            sb.append("%20");
        } else if (c == '\n') {
            sb.append("%0A%0D");
        } else {
            sb.append(c);
        }
    }

    return sb.toString();
}