Java 用JSmooth包装.jar时字符串搜索中断

Java 用JSmooth包装.jar时字符串搜索中断,java,netbeans,wrapper,executable,jsmooth,Java,Netbeans,Wrapper,Executable,Jsmooth,我这里有个奇怪的问题。我有一个小java程序,可以过滤Minecraft日志文件,使其更易于阅读。在这些日志的每一行上,通常有字符“§”的多个实例,该字符返回FFFD的十六进制值 我使用以下方法过滤掉此字符(以及其后面的字符): 现在,当我通过NetBeans运行程序时,它工作得非常好。我的行输出如下所示: CxndyAnnie: Mhm CxndyAnnie: Sorry §e§7[§f$65§7] §1§nCxndyAnnie§e: Mhm §e§7[§f$65§7] §1§nCxndyA

我这里有个奇怪的问题。我有一个小java程序,可以过滤Minecraft日志文件,使其更易于阅读。在这些日志的每一行上,通常有字符“§”的多个实例,该字符返回FFFD的十六进制值

我使用以下方法过滤掉此字符(以及其后面的字符):

现在,当我通过NetBeans运行程序时,它工作得非常好。我的行输出如下所示:

CxndyAnnie: Mhm
CxndyAnnie: Sorry
§e§7[§f$65§7] §1§nCxndyAnnie§e: Mhm
§e§7[§f$65§7] §1§nCxndyAnnie§e: Sorry
但是,当我构建.jar文件并使用JSmooth将其包装成.exe文件时,当我运行.exe时,该字符不再被过滤掉,我的行显示如下:

CxndyAnnie: Mhm
CxndyAnnie: Sorry
§e§7[§f$65§7] §1§nCxndyAnnie§e: Mhm
§e§7[§f$65§7] §1§nCxndyAnnie§e: Sorry
(注意:显示额外的方括号和$65是因为它们的筛选依赖于特殊字符,并且它的下一个字符首先被删除)

你知道为什么在通过JSmooth之后,这个方法不再有效吗?文本替换是否有其他方式可以保留其功能

顺便说一下,我还尝试使用

currentLine = currentLine.replaceAll("§.", "");
但这在Netbeans和.exe中都不起作用

我将继续并通过下面的完整方法:

 public static String[] filterLines(String[] allLines, String filterType, Boolean timeStamps) throws IOException {
    String currentLine = null;
    FileWriter saveFile = new FileWriter("readable.txt");
    String heading;
    String string1 = "[L]";
    String string2 = "[A]";
    String string3 = "[G]";
    if (filterType.equals(string1)) {
        heading = "LOCAL CHAT LOGS ONLY \r\n\r\n";
    }
    else if (filterType.equals(string2)) {
        heading = "ADVERTISING CHAT LOGS ONLY \r\n\r\n";
    }
    else if (filterType.equals(string3)) {
        heading = "GLOBAL CHAT LOGS ONLY \r\n\r\n";
    }
    else {
        heading = "CHAT LINES CONTAINING \"" + filterType + "\" \r\n\r\n";    
    }
    saveFile.write(heading);

    for (int i = 0; i < allLines.length; i++) {
        if ((allLines[i] != null ) && (allLines[i].contains(filterType))) {
            currentLine = allLines[i];
            if (!timeStamps) {
                currentLine = currentLine.replaceAll("\\[..:..:..\\].", "");
            }
            currentLine = currentLine.replaceAll("\\[Client thread/INFO\\]:.", "");
            currentLine = currentLine.replaceAll("\\[CHAT\\].", "");
            currentLine = currentLine.replaceAll("\uFFFD.", "");
            currentLine = currentLine.replaceAll("\\[A\\].", "");
            currentLine = currentLine.replaceAll("\\[L\\].", "");
            currentLine = currentLine.replaceAll("\\[G\\].", "");
            currentLine = currentLine.replaceAll("\\[\\$..\\].", "");
            currentLine = currentLine.replaceAll(".>", ":");
            currentLine = currentLine.replaceAll("\\[\\$100\\].", "");
            saveFile.write(currentLine + "\r\n");
            //System.out.println(currentLine);
        }
    }
    saveFile.close();
    ProcessBuilder openFile = new ProcessBuilder("Notepad.exe", "readable.txt");
    openFile.start();
    return allLines;
}

我过去在minecroft日志中也遇到过类似的问题,我不记得确切的细节,但问题归结为文件格式问题,UTF8编码工作正常,但其他一些文本编码(包括系统默认值)工作不正常

第一: 确保在从文件读取byteArray时指定UTF8编码,以便
allLines
包含正确的信息,如:

Path fileLocation = Paths.get("C:/myFileLocation/logs.txt");
byte[] data = Files.readAllBytes(fileLocation);
String allLines = new String(data , Charset.forName("UTF-8"));
第二: 使用
\uFFFD
不起作用,因为
\uFFFD
仅用于替换值未知或在Unicode中不可表示的传入字符

但是,如果您使用了正确的编码(如我的第一点所示),则不需要
\uFFFD
,因为值§在unicode中是已知的,因此您可以简单地使用

currentLine.replaceAll(§,“”)

或者专门为该字符
U+00A7
使用实际的unicode字符串,如下所示

currentLine.replaceAll(“\u00A7”和“”)


或者在代码中同时使用这两行。

我过去在minecroft日志中也遇到过类似的问题,我不记得确切的细节,但问题归结为文件格式问题,UTF8编码工作正常,但包括系统默认值在内的一些其他文本编码工作不正常

第一: 确保在从文件读取byteArray时指定UTF8编码,以便
allLines
包含正确的信息,如:

Path fileLocation = Paths.get("C:/myFileLocation/logs.txt");
byte[] data = Files.readAllBytes(fileLocation);
String allLines = new String(data , Charset.forName("UTF-8"));
第二: 使用
\uFFFD
不起作用,因为
\uFFFD
仅用于替换值未知或在Unicode中不可表示的传入字符

但是,如果您使用了正确的编码(如我的第一点所示),则不需要
\uFFFD
,因为值§在unicode中是已知的,因此您可以简单地使用

currentLine.replaceAll(§,“”)

或者专门为该字符
U+00A7
使用实际的unicode字符串,如下所示

currentLine.replaceAll(“\u00A7”和“”)


或者在代码中同时使用这两行。

哦,太棒了。我甚至不认为这是一个编码问题。我会在一个小时左右回到那个话题,我会告诉你们事情的进展。就是这样!谢谢大家!!哦,太棒了。我甚至不认为这是一个编码问题。我会在一个小时左右回到那个话题,我会告诉你们事情的进展。就是这样!谢谢大家!!