【发布时间】:2023-04-10 01:53:01
【问题描述】:
我正在使用 NetBeans 用 Java 制作应用程序,但我遇到了文件编码问题。
该应用程序的目的是为另一个软件创建必要的文件(项目文件)(LedshowYQ 2016)。 LedshowYQ 2016 与 LED 标牌一起使用。
我面临的问题是 txs 文件。这些文件用于在标志上发送文本。除了所需的文本之外,它们还包含格式和颜色信息。
在下面的链接中,您可以下载 txs 文件。 txs file
当我在记事本中打开文件时,我得到了这个:
-8 1 3 1
-7 0 -1 0 0 0 0 0
-9 2 0 0 2 0 1
rvs
X StyleNameNormal text
SizeDoubleFontNameTahomaColorclWhiteUnicode Size -9 2 0 0 2 0 2
rvs
E StyleNameLeftStandardOptionsrvpaoDoNotWantReturns Tabs -9 2 0 0 2 0 4
rvs
-9 0 0 0 0 0 7
0 1 0 8 0 0
D u m m y T e x t )
但是,当我在 Sublime Text 中打开它时,我得到了这个:
2d38 2031 2033 2031 0d0a 2d37 2030 202d
3120 3020 3020 3020 3020 300d 0a2d 3920
3220 3020 3020 3220 3020 310d 0a72 7673
0d0a 5800 0000 0e01 0953 7479 6c65 4e61
6d65 060b 4e6f 726d 616c 2074 6578 740a
5369 7a65 446f 7562 6c65 0218 0846 6f6e
744e 616d 6506 0654 6168 6f6d 6105 436f
6c6f 7207 0763 6c57 6869 7465 0755 6e69
636f 6465 0904 5369 7a65 020c 0000 2d39
2032 2030 2030 2032 2030 2032 0d0a 7276
730d 0a45 0000 000e 0109 5374 796c 654e
616d 6506 044c 6566 7408 5374 616e 6461
7264 0807 4f70 7469 6f6e 730b 1572 7670
616f 446f 4e6f 7457 616e 7452 6574 7572
6e73 0004 5461 6273 0e00 0000 2d39 2032
2030 2030 2032 2030 2034 0d0a 7276 730d
0a02 0000 000e 002d 3920 3020 3020 3020
3020 3020 370d 0a30 2031 2030 2038 2030
2030 0d0a 4400 7500 6d00 6d00 7900 2000
5400 6500 7800 7400 2920
从上面我了解到该文件是十六进制格式。 因此,我最初的解决方案是在字符串变量中添加不会更改的十六进制代码,从文本字段中获取文本,将其转换为十六进制,将其添加到字符串变量并将其写入新的 txs 文件。
private String baseText = "contains the unchanged part of the code";
private String readedText = textField1Bar.getText();
private String hexTextConv = String.format("%x", new BigInteger(1, readedText.getBytes(StandardCharsets.UTF_8)));
hexTextConv += "2920";
String filePath = "C:\\Users\\user\\Desktop\\mytext.txs";
File myTxsFile = new File(filePath);
try{
myTxsFile.createNewFile();
}catch(IOException ex){
Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
}
try{
FileWriter sfwTxs = new FileWriter(myTxsFile);
try(BufferedWriter sfbwTxs = new BufferedWriter(sfwTxs)){
sfbwTxs.write(hexTextConv);
sfbwTxs.flush();
}catch(IOException ex){
Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
}
}catch(IOException ex){
Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
}
但是当我在Ledshow中打开时,却没有显示出来……
然后,我想以某种方式制作键盘记录器。我从文本字段中获取文本,读取所有字符,并使用 switch 语句将每个字符转换为十六进制值。所有这些值都添加到初始 String 变量并写入 txs 文件。
不过,结果是一样的。不能在Ledshow中显示。
我使用了 StandardChaset 的所有可用选项,但没有运气。
然后我认为文件的格式可能与崇高文本中看到的不同,我在将其写入文件之前将十六进制代码转换为字节。
byte[] b = hexTextConv.getBytes(StandardCharsets.UTF_16LE);
//
//
//
try (FileOutputStream fos = new FileOutputStream(filePath)) {
fos.write(b);
}catch (FileNotFoundException ex) {
Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
}
结果是一样的!:) 为了满足我的好奇心,我用 Sublime 文本打开了创建的文件,输出的十六进制值和以前一样。
有人知道如何解决这个问题吗? 我真的没有想法,我无法从这一点继续前进。
【问题讨论】:
-
只是想指出,长帖子通常是好的;它们表明了研究和努力(假设其中大部分是实际文本,而不是 1000 行代码转储或虚拟文本以绕过系统质量检查)。
-
没有“文件为十六进制格式”之类的东西。只是崇高以某种方式决定该文件不是纯文本,而是向您显示文件的十六进制转储,就好像它是二进制文件一样。这可能是因为该文件除了文本内容之外还包含一些控制字符。记事本根本不支持这一点,只是尝试将所有内容显示为文本。