在Linux下,尝试读取UTF-8字符的二进制文件并用javafx.scene.Text
显示它们时出现分段错误。我不知道什么是敌对字符,也无法成功显示任何二进制文件。在Windows下,如果我使用其他字符集,例如StandardCharsets.ISO_8859_1
也永远不会发生。
编辑:添加了可编译的示例(对我而言这总是崩溃,我的Linux发行版是Solus):
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class Test extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Hello World!");
Text text = new Text();
// Replace with an existing file
Path path = Paths.get("/home/myname/Test/Rubik-Black.ttf");
InputStream input = Files.newInputStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
char[] buffer = new char[50000];
reader.read(buffer);
String str = new String(buffer);
StackPane root = new StackPane();
root.getChildren().add(text);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
Platform.runLater(() -> {
text.setText(str);
});
}
}
stacktrace片段显示问题似乎出在libpango库(JavaFX使用的字体渲染/布局库):
(0x00007FC796177407 [libpango-1.0.so.0+0x20407])
pango_itemize_with_base_dir+0xbf (0x00007FC7961784BF [libpango-1.0.so.0+0x214bf])
pango_itemize+0x59 (0x00007FC796178839 [libpango-1.0.so.0+0x21839])
(0x00007FC81F968DC4 [libj9vm29.so+0x137dc4])
(0x00007FC81F9664D7 [libj9vm29.so+0x1354d7])
(0x00007FC81F85325A [libj9vm29.so+0x2225a])
(0x00007FC81F843B10 [libj9vm29.so+0x12b10])
(0x00007FC81F8FED82 [libj9vm29.so+0xcdd82])
根据该片段,似乎JavaFX使用的是libpango的非常旧的版本-1.0,该版本于2009年发布。
除了更改字符集以外,是否还有其他人遇到此问题,并且有可能的解决方法?
我的用例是我的应用程序中具有“强制文本视图”功能,可将文件显示为文本。