增加编码判断优化性能

This commit is contained in:
许轲 2023-08-11 05:37:09 +08:00
parent 63c60c99af
commit 73a6967eff
5 changed files with 59 additions and 7 deletions

View File

@ -16,6 +16,13 @@
<dependencies> <dependencies>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>2.5.0</version>
</dependency>
<dependency> <dependency>
<groupId>org.openjfx</groupId> <groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId> <artifactId>javafx-fxml</artifactId>

View File

@ -1,6 +1,5 @@
module org.jcnc.jnotepad { module org.jcnc.jnotepad {
requires javafx.controls; requires javafx.controls;
requires javafx.fxml;
exports org.jcnc.jnotepad; exports org.jcnc.jnotepad;
} }

View File

@ -10,11 +10,11 @@ import javafx.stage.FileChooser;
import org.jcnc.jnotepad.MainApp; import org.jcnc.jnotepad.MainApp;
import java.io.*; import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
import static org.jcnc.jnotepad.ViewManager.*; import static org.jcnc.jnotepad.ViewManager.*;
import static org.jcnc.jnotepad.controller.EncodingDetector.detectEncoding;
/** /**
* 控制器类负责处理与用户界面的交互并实现相关事件处理逻辑 * 控制器类负责处理与用户界面的交互并实现相关事件处理逻辑
@ -221,14 +221,14 @@ public class Controller {
enCodingLabel.setText("\t编码: " + encoding); enCodingLabel.setText("\t编码: " + encoding);
} }
// 判断编码是否有效 /* // 判断编码是否有效
public static boolean isEncodingValid(String text, Charset encoding) { public static boolean isEncodingValid(String text, Charset encoding) {
byte[] bytes = text.getBytes(encoding); byte[] bytes = text.getBytes(encoding);
String decodedText = new String(bytes, encoding); String decodedText = new String(bytes, encoding);
return text.equals(decodedText); return text.equals(decodedText);
} }*/
// 检测文本编码 /* // 检测文本编码
public static String detectEncoding(String text) { public static String detectEncoding(String text) {
Charset[] possibleEncodings = {StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1, StandardCharsets.UTF_16}; Charset[] possibleEncodings = {StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1, StandardCharsets.UTF_16};
for (Charset encoding : possibleEncodings) { for (Charset encoding : possibleEncodings) {
@ -238,7 +238,7 @@ public class Controller {
} }
} }
return "未知"; return "未知";
} }*/
// 获取光标所在行数 // 获取光标所在行数
public static int getRow(int caretPosition, String text) { public static int getRow(int caretPosition, String text) {

View File

@ -0,0 +1,47 @@
package org.jcnc.jnotepad.controller;
import javafx.scene.control.TextArea;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
public class EncodingDetector {
public static String detectEncoding(TextArea textArea) {
String text = textArea.getText();
return detectEncoding(text);
}
public static String detectEncoding(String text) {
// 尝试常见的编码
for (Charset charset : commonCharsets()) {
if (isValidEncoding(text, charset)) {
System.out.println(isValidEncoding(text, charset));
return charset.name();
}
}
return "UNKNOWN";
}
private static Charset[] commonCharsets() {
return new Charset[] {
StandardCharsets.UTF_8,
StandardCharsets.UTF_16,
StandardCharsets.UTF_16LE,
StandardCharsets.UTF_16BE,
StandardCharsets.ISO_8859_1
};
}
private static boolean isValidEncoding(String text, Charset encoding) {
// 尝试使用指定编码解码
byte[] bytes = text.getBytes(encoding);
String decoded = new String(bytes, encoding);
// 解码后的文本相同表示编码有效
return text.equals(decoded);
}
}

View File

@ -1,7 +1,6 @@
package org.jcnc.jnotepad.view; package org.jcnc.jnotepad.view;
import javafx.scene.control.TextArea; import javafx.scene.control.TextArea;
import org.jcnc.jnotepad.ViewManager;
import org.jcnc.jnotepad.controller.Controller; import org.jcnc.jnotepad.controller.Controller;
import static org.jcnc.jnotepad.ViewManager.*; import static org.jcnc.jnotepad.ViewManager.*;