Java 智能卡读卡器库上的编码错误 问题

Java 智能卡读卡器库上的编码错误 问题,java,javafx,smartcard,Java,Javafx,Smartcard,我在一家公司工作,那里有一个应用程序,客人必须使用他们的比利时身份证进行注册,这是一个智能卡,其中包含个人的数据(姓名、年龄、性别等)。但它读错了某些字符:é,ç,。。。我发现这是读取ID的库和java程序之间的问题。库必须以不同的编码读取字符串,或者当字符串被放入java应用程序中时,库必须以非编码的形式读取字符串。这些字符串被错误地读取 尝试 在显示字符串之前,我已经尝试捕捉它,查找不正确的字符并将它们转换回正确的字符。例:搜索ç 并用ç替换它。但这似乎不起作用。我也尝试过升级和降级图书馆

我在一家公司工作,那里有一个应用程序,客人必须使用他们的比利时身份证进行注册,这是一个智能卡,其中包含个人的数据(姓名、年龄、性别等)。但它读错了某些字符:é,ç,。。。我发现这是读取ID的库和java程序之间的问题。库必须以不同的编码读取字符串,或者当字符串被放入java应用程序中时,库必须以非编码的形式读取字符串。这些字符串被错误地读取

尝试 在显示字符串之前,我已经尝试捕捉它,查找不正确的字符并将它们转换回正确的字符。例:搜索ç 并用ç替换它。但这似乎不起作用。我也尝试过升级和降级图书馆,看看它是否会有所不同,但这些相同的阅读错误仍然存在。用于读取ID的库是Commonis eid

System.out.println("card connected.");
BeIDCards beIDCards = new BeIDCards();
try {
      final BeIDCard beIDCard = beIDCards.getOneBeIDCard();

      System.out.println("reading identity file");
      final byte[] identityFile = beIDCard.readFile(FileType.Identity);
      final Identity identity = TlvParser.parse(identityFile,
                    Identity.class);
      final String firstName = StringUtilities.format(identity.firstName);
      final String lastName = identity.name;

      //geslacht selecteren.
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    int index = 0;
                    switch (identity.gender) {
                        case MALE:
                            index = 1;
                            break;
                        case FEMALE:
                            index = 2;
                            break;
                        default:
                            index = 3;
                            break;
                    }

                    //zorgt evoor dat de volledige node weergegeven wordt en niet een deel.
               cbTitle.getSelectionModel().select(index);
                    laadcirkel.setVisible(false);
                    txtFirstName.setText(firstName);
                    txtLastName.setText(lastName);
                    txtFirstName.autosize();
                    txtLastName.autosize();
                }
            });

            if (beIDCards.getAllBeIDCards().contains(beIDCard)) {
                System.out.println("waiting for card removal");
                beIDCards.waitUntilCardRemoved(beIDCard);
            }

            System.out.println("card removed");
        } catch (final CancelledException cex) {
            System.out.println("Cancelled By User");
        } catch (CardException ex) {
            Logger.getLogger(AanmeldPagina.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(AanmeldPagina.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InterruptedException ex) {
            Logger.getLogger(AanmeldPagina.class.getName()).log(Level.SEVERE, null, ex);
        }
读取eID代码 这是读取eID的代码,该代码适用于eID的每个版本,除非名称包含特殊字符,如:é,ù。。。然后检索到的字符串被放置在javafx文本字段中。但是,由于java是用utf-16(或类似的东西)编码的,所以在将文本放入textfield时,出现问题的可能性很小。使用的库是Commons eid

System.out.println("card connected.");
BeIDCards beIDCards = new BeIDCards();
try {
      final BeIDCard beIDCard = beIDCards.getOneBeIDCard();

      System.out.println("reading identity file");
      final byte[] identityFile = beIDCard.readFile(FileType.Identity);
      final Identity identity = TlvParser.parse(identityFile,
                    Identity.class);
      final String firstName = StringUtilities.format(identity.firstName);
      final String lastName = identity.name;

      //geslacht selecteren.
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    int index = 0;
                    switch (identity.gender) {
                        case MALE:
                            index = 1;
                            break;
                        case FEMALE:
                            index = 2;
                            break;
                        default:
                            index = 3;
                            break;
                    }

                    //zorgt evoor dat de volledige node weergegeven wordt en niet een deel.
               cbTitle.getSelectionModel().select(index);
                    laadcirkel.setVisible(false);
                    txtFirstName.setText(firstName);
                    txtLastName.setText(lastName);
                    txtFirstName.autosize();
                    txtLastName.autosize();
                }
            });

            if (beIDCards.getAllBeIDCards().contains(beIDCard)) {
                System.out.println("waiting for card removal");
                beIDCards.waitUntilCardRemoved(beIDCard);
            }

            System.out.println("card removed");
        } catch (final CancelledException cex) {
            System.out.println("Cancelled By User");
        } catch (CardException ex) {
            Logger.getLogger(AanmeldPagina.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(AanmeldPagina.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InterruptedException ex) {
            Logger.getLogger(AanmeldPagina.class.getName()).log(Level.SEVERE, null, ex);
        }

尝试将名称打印到控制台或将其写入文件。这很可能是代码将原始数据转换为
String
s的问题。我有,问题是我无法访问正在吐出名称的库,在它读取卡后,它返回一个已经包含这些错误的字符串。你知道ID卡上使用的是哪种编码吗?您可以尝试“重新编码”字符串的
字节[]
数据,例如
新字符串(string.getBytes(),correctCharSet)
(不确定这在所有情况下都有效)。这假设库只使用
字符串(byte[])
构造函数,而不是
字符串(byte[],Charset)
。或者为jvm添加命令行参数,将正确的编码指定为默认编码……我不知道StringUtilities.format打算做什么,但您似乎怀疑TlvParser。如果TlvParser在没有编码的情况下错误地使用
字符串(字节[])
构造函数,则可以执行
System.setProperty(“file.encoding”,“Cp1252”)
“UTF-8”
(如果一个字符有两个字符)。请参阅尝试将名称打印到控制台或将其写入文件。这很可能是代码将原始数据转换为
String
s的问题。我有,问题是我无法访问正在吐出名称的库,在它读取卡后,它返回一个已经包含这些错误的字符串。你知道ID卡上使用的是哪种编码吗?您可以尝试“重新编码”字符串的
字节[]
数据,例如
新字符串(string.getBytes(),correctCharSet)
(不确定这在所有情况下都有效)。这假设库只使用
字符串(byte[])
构造函数,而不是
字符串(byte[],Charset)
。或者为jvm添加命令行参数,将正确的编码指定为默认编码……我不知道StringUtilities.format打算做什么,但您似乎怀疑TlvParser。如果TlvParser在没有编码的情况下错误地使用
字符串(字节[])
构造函数,则可以执行
System.setProperty(“file.encoding”,“Cp1252”)
“UTF-8”
(如果一个字符有两个字符)。请参阅