Java 我不知道';我看不出有错。(Mailto的转换代码)

Java 我不知道';我看不出有错。(Mailto的转换代码),java,string,mailto,for-in-loop,Java,String,Mailto,For In Loop,我的意图是将一个字符串转换为mailto,但是,我发现了一个问题,当我设置“特征线”“全部删除”并只设置最后一行时 public String mailto(String texto){ String total=""; for (int i = 0; i < texto.length(); i++) if (texto.charAt(i)!=' ' && texto.charAt(i)!='\n'{

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

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
}
公共字符串mailto(字符串texto){
字符串总数=”;
对于(int i=0;i
公共字符串mailto(字符串texto){
字符串总数=”;
对于(int i=0;i

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

不要手动滚动URL编码(很容易出错!),使用现有的URL编码

public String mailto(String texto) {
    return URLEncoder.encode(texto);
}
请注意,这会产生一个稍微不同(但有效)的结果:空间编码为
+
,而不是
%20

如果出于某种原因,您希望/需要编写自己的特殊电子邮件编码器,您可以使用以下方法缩短代码:

如果您关心性能(请注意实际测量!),请不要通过串联构造字符串,而是使用

再加上代码的修复,以及轻微的重写以增加可读性,这将产生

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();
}
公共字符串mailto(最终字符串texto){
最终StringBuilder der sb=新StringBuilder();
对于(int i=0;i
第二个和第三个if语句应该检查
='
=='\n'
。替换更好,但正确的解决方案不是使用库函数进行URL编码吗?@Clashsoft你完全正确。我假设OP有一些理由手动滚动它,但谁知道呢。让我快速补充一下。我有替换的问题与此相同,当我放置\n仅捕获最后一行时,问题明显在于代码“\n”,我替换了\n System.lineSeparator(),仅此而已。谢谢
public String mailto(String texto) {
    return texto.replace(" ", "%20").replace("\n", "%0D%0A");
}
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();
}