我编写了一个简单的GUI屏幕,其实际上包含一个JavaFx textField,用户输入一个字符串,并且我必须将该字符串传递给TCP客户端。
现在问题是用户输入一个包含SOH作为分隔符的字符串。 SOH只不过是“\ u001”。但是当用户输入包含此分隔符的String时,它将被删除,并且只检索简单的纯文本。我怎么能消除这个。这个独特的角色对我来说非常重要。 例如,我的字符串如下:
8=FIX.4.2\u001 9=9 \u001 35=A \u001 34=1\u001 49=TTDS68AP
观察上面的String,其中我有代表SOH的\ u001字符。但是当我在TextField中输入这个String时,结果如下:
8=FIX.4.29=9135=A34=149=TTDS68AP
如何从文本字段中获取SOH字符?
答案 0 :(得分:4)
问题是javaFX TextField
使用以下function过滤了无效字符:
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);
答案 1 :(得分:1)
我认为问题是您想通过键盘输入并在文本字段中查看控制字符:
所以我来到了以下解决方案:
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粘贴文本。
答案 2 :(得分:-1)
尝试添加您的编码作为参数。
System.setProperty("file.encoding", "yourEncoding");
我认为UTF-8应该有用。