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