如何在JAVAFx中接受TextField中的SOH字符

如何在JAVAFx中接受TextField中的SOH字符,java,javafx,Java,Javafx,我编写了一个简单的GUI屏幕,它实际上包含一个JavaFx文本字段,用户在其中输入一个字符串,我必须将该字符串传递给TCP客户端 现在的问题是用户输入一个包含SOH作为分隔符的字符串。 SOH只不过是“\u001”。但是,当用户输入包含此分隔符的字符串时,它将被删除,并且只检索简单的纯文本。我怎样才能消除这个。这种独特的性格对我来说非常重要。 例如,我的字符串如下所示: 8=FIX.4.2\u001 9=9 \u001 35=A \u001 34=1\u001 49=TTDS68AP 查看上面

我编写了一个简单的GUI屏幕,它实际上包含一个JavaFx文本字段,用户在其中输入一个字符串,我必须将该字符串传递给TCP客户端

现在的问题是用户输入一个包含SOH作为分隔符的字符串。 SOH只不过是“\u001”。但是,当用户输入包含此分隔符的字符串时,它将被删除,并且只检索简单的纯文本。我怎样才能消除这个。这种独特的性格对我来说非常重要。 例如,我的字符串如下所示:

8=FIX.4.2\u001 9=9 \u001 35=A \u001 34=1\u001 49=TTDS68AP
查看上面的字符串,其中\u001字符表示SOH。但当我在文本字段中输入此字符串时,结果如下:

8=FIX.4.29=9135=A34=149=TTDS68AP

如何也从文本字段中获取SOH字符?

尝试将您的编码添加为参数

System.setProperty("file.encoding", "yourEncoding");

我认为UTF-8应该可以工作。

我认为问题在于您希望通过键盘输入,并在文本字段中看到控制字符:

  • 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");

出于完整性考虑,仍然需要使用SOHs粘贴文本。

问题在于javaFX
TextField
使用以下内容过滤无效字符:

添加上述内容将在粘贴后和存储前对其进行更改。如果要使用文本字段中的
字符串
,则需要将其替换回
SOH

String withSOH = field.getText().replace('\u2401', (char)1);

您如何验证它是否已删除?用户如何输入SOH字符?Dump
Arrays.toString(s.toCharArray())
@Kayaman通过调试,我可以看到在文本字段中输入的文本。实际上,我将把数据存储到一个字符串对象中,该对象输入到TextField中。因此,我可以在那里放置断点,并且可以看到字符串
System.out.println(Arrays.toString(textField.getText().tocharray())
中没有SOH字符(感谢@Kayaman的建议)。调试也是可行的。但是仅仅显示字符串对控制字符没有帮助。不,先生,我不想在textField中看到它。我想要的是,当我将其存储在字符串对象中时,字符串不应丢失SOH字符。然后
SOH\u REPR=“\u0001”
就足够了,先生。它不起作用。而且我不是用键盘打字。我直接粘贴字符串,最后我已经说过粘贴仍然没有完成。我希望Oleg的答案更合适。所以我在控制器的初始化部分使用上面的过滤器。但同样的事情重复了。在控制台上显示时,我看不到SOH字符。基本上,我的字符串将类似于8=FIX.4.2SOH9=91SOH35=ASOH34=1SOH49=TTDS68APSOH当粘贴到文本字段时,我在字段中看不到该字符串,并且在字段中使用getText()方法时也看不到该字符串。您是否为正确的
文本字段设置了它?你看到了什么?它适合我,我可以用
SOH
粘贴一个字符串并查看它。如果你不能让它工作,请张贴一个是。我编写的代码类似于cutomStringTextField.setTextFormatter(newTextFormatter((t)->{t.setText(t.getText().replace((char)1,'\u0001'));返回t;});在初始化部分。单击submit按钮时,操作事件从字段中检索文本,形式为String text=cutomStringTextField.getText().replace('\u0001',(char)1);System.err.println(文本);我创建了一个,如果您运行它,请在文本字段中粘贴
SOH
,然后单击按钮,它会将
1
输出到控制台。对不起。我想你误解了我的问题。我将输入一个包含SOH字符的字符串,中间的一些可以在java中表示为“001”。因此,当我在TextField中给出这个字符串时,getText()方法应该给出确切的字符串,包括字符串中的\001字符。但它正在移除它。
textField.setTextFormatter(new TextFormatter<>((t) -> {
    t.setText(t.getText().replace((char)1, '\u2401'));
    return t;
}));
String withSOH = field.getText().replace('\u2401', (char)1);