【问题标题】:Reading currency Symbol as string in Java在Java中将货币符号读取为字符串
【发布时间】:2018-02-08 07:50:17
【问题描述】:

我实际上需要在我的 pgAdmin 数据库中为货币导入一个 csv 文件。我的文件如下;

我的代码如下,使用 ISO-8859-1 格式。

        File fileDir = new File(fileName);       
        FileInputStream fis= new FileInputStream(fileDir);
        InputStreamReader isr= new InputStreamReader(fis, "ISO-8859-1");
        BufferedReader br = new BufferedReader(isr);            
        String line;
        line = br.readLine();
        String[] arrayHeader = line.split(";");         
        size = arrayHeader.length;       

        if(size==expectedSize){
             //check header 
            String header[] = {"Currency_ISO", "Currency_Label", "Currency_Symbol"};
            for(int i=0;i<header.length;i++){
                if(arrayHeader[i].trim().equals(header[i])){
                    fileStatus = true; 
                    sResult = "File Status: Valid <br/> "; 
                }
                else{
                    fileStatus = false;
                    sResult = "File Status: Invalid <br/> "; 
                    break;
                }
            }
        }else{
            fileStatus = false;  
            sResult = "File Status: Invalid <br/> ";    
        }       

        if(fileStatus){     

             while ((line = br.readLine()) != null) {
                 String[] arrayData = line.split(";", -1);

                //create object 
                objCurrency = new clsCurrency(); 

                if(arrayData[0] != "" && !arrayData[0].isEmpty() && arrayData[0].trim() != ""){

                    objCurrency.setsCurrencyIso(arrayData[0].trim());
                }else{
                    objCurrency.setsCurrencyIso(null);
                }

                if(arrayData[1] != "" && !arrayData[1].isEmpty() && arrayData[1].trim() != ""){                                         
                    objCurrency.setsCurrencyLabel(arrayData[1].trim());
                }else{
                    objCurrency.setsCurrencyLabel(null);
                }

                if(arrayData[2] != "" && !arrayData[2].isEmpty() && arrayData[2].trim() != ""){
                System.out.println("setsLocalCurrencySymbol: " + arrayData[2]);
                    objCurrency.setsCurrencySymbol(arrayData[2].trim());
                }else{
                    objCurrency.setsCurrencySymbol(null);
                }

                lstCurrencyImported.add(objCurrency);

            }//end while    

如您所见,我有一个System.out.Println() 来检查正在读取的符号值。但主要问题是符号没有被正确读取。它正在返回?。见下面的println;

[stdout] (default task-7) setsCurrencySymbol: ?

我尝试将格式更改为UTF-8UTF-16,但没有成功。 我在网上看到有Java的currency类,但问题是我需要直接从csv中读取它,而且我认为用户不知道每种货币的代码。

知道我该如何从这里开始吗?

【问题讨论】:

标签: java csv currency iso


【解决方案1】:

如果您的 CSV 文件包含欧元符号,则它不可能是 ISO-8859-1。 ISO-8859-1 中不存在欧元符号。已添加到ISO-8859-15

首先,找出您的 CSV 文件实际使用的编码方式。然后,配置 Java InputStreamReader 以使用该编码。

【讨论】:

  • 请使用十六进制编辑器查看您的文件。如果欧元符号读取为 0x80,则文件为 Windows CP 1252,如果为 0xa4,则编码为 ISO-8859-15。
  • 感谢您的回复,但我怎么知道编码。用户只需在记事本中打开 csv 并更新它。在记事本中,我认为没有指定编码。我尝试将编码更改为 ISO-8859-15,但仍然无效。
  • 您可以在使用记事本保存时设置编码,但我认为默认情况下它使用 Windows-1252(它称为“ANSI”)。
  • 但在 Windows-1252 中,它接受符号,对吧?
  • $ 和 € 在 Windows-1252 中存在,是的,虽然我无法确定这是否是您的文件所在的编码。
【解决方案2】:
  • ISO-8859-1 又名 Latin-1 不包含 € 符号。
  • ISO-8859-15 是一个扩展€符号。
  • Windows-1252 / CP-1252(代码页)又名 Windows Latin-1 取代了浏览器中仍称为 ISO-8859-1 的内容(甚至正式在 HTML5 中)。

由于 Windows-1252 还包含比 ISO-8859-15 更多的字符,例如引号等逗号,因此最好使用它来正确阅读文本。

然后文本在字符串中是正确的(在 Unicode 中)。

另一种选择,当用户的 PC 确定使用哪个字符集,并且 软件在那里运行,您可以使用Charset.defaultCharset() 作为 InputStreamReader 的参数,或者干脆不提供参数。

在控制台中显示字符串再次涉及到默认操作系统字符集的转换。在美国的 Windows 中也可能是 Windows-1252。如果字符集不知道 € 它将被转换为 ?,但它会在字符串中。

例如,您可以将其写入 UTF-8 文件。

【讨论】:

  • 谢谢。我尝试将 csv 保存为 UTF-8 并使用相同的编码读取它。现在即使在列名中,它的读数也是 ?Currency_ISO 而不是 Currency_ISO。不明白为什么要添加'?'
  • 第一个可能源于 BOM(文件开始标记)字符,这是一个多余的零宽度空间,但 Windows 在记事本中将文件识别为 UTF-8。也许 Windows-1252 在这里是最简单的,虽然我也更喜欢 UTF-8(没有 BOM)。
猜你喜欢
  • 1970-01-01
  • 2019-09-08
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 2010-10-17
相关资源
最近更新 更多