我写了简单的GUI屏幕,该屏幕实际上包含一个Javafx Textfield,用户输入字符串,我必须将其传递给TCP客户端。
现在,问题是用户输入包含SOH作为定界线的字符串。SOH不过是" u001"。但是,当用户输入包含此定界符的字符串时,将其删除,并且仅检索简单的纯文本。我如何消除这一点。这个独特的角色对我来说非常重要。例如,我的字符串如下:
8=FIX.4.2u001 9=9 u001 35=A u001 34=1u001 49=TTDS68AP
观察者上面的字符串,其中我具有代表soh的 u001字符。但是当我在文本字段中输入此字符串时,结果就像:
8=FIX.4.29=9135=A34=149=TTDS68AP
如何也从文本字段中获得SOH字符?
问题是javafx TextField
过滤了无效的字符,具有以下功能:
private static boolean isInvalidCharacter(char c, boolean newlineIllegal, boolean tabIllegal) {
if (c == 0x7F) return true;
if (c == 0xA) return newlineIllegal;
if (c == 0x9) return tabIllegal;
if (c < 0x20) return true;
return false;
}
这是在粘贴和将字符串存储在字段中之前发生的。在称为"自定义过滤器"的功能之前,在此滤镜中,您可以将SOH
更改为其他东西。它是Unicode表示␁是一个很好的候选人:
textField.setTextFormatter(new TextFormatter<>((t) -> {
t.setText(t.getText().replace((char)1, 'u2401'));
return t;
}));
添加上述内容将在粘贴和存储之前将其更改。当您想从TextField使用String
时,您需要使用以下方式将其替换为SOH
String withSOH = field.getText().replace('u2401', (char)1);
我认为问题是您要通过键盘输入并在文本字段中查看控制字符:
- ctrl-a(soh)是已知的快捷方式,并且选择了先前的字符。
- 控制字符将不会以普通字体显示。
所以我来了以下解决方案:
String SOH_REPR = "°"; // We show SOH as this string.
someTextField.setOnKeyPressed((ke) -> {
if (ke.getCode().getName().equals("A")
&& ke.isControlDown()
&& !ke.isAltDown()
&& !ke.isMetaDown()
&& !ke.isShiftDown()) {
TextField textField = (TextField) ke.getSource();
ke.consume();
int pos = textField.getCaretPosition();
textField.insertText(pos, SOH_REPR);
}
});
someTextField.setOnKeyReleased((ke) -> {
if (ke.getCode().getName().equals("A")
&& ke.isControlDown()
&& !ke.isAltDown()
&& !ke.isMetaDown()
&& !ke.isShiftDown()) {
ke.consume();
}
});
// Convert it back.
String text = someTextField.getText().replace(SOH_REPR, "u0001");
仍然需要用SOH粘贴文本以解决完整性。
尝试将您的编码添加为参数。
System.setProperty("file.encoding", "yourEncoding");
我认为UTF-8应该起作用。