Java解压奇怪的字符(编码?)

时间:2015-02-19 16:38:18

标签: java encoding zip java-io

当我在java中解压缩zip文件时,我在文件名中看到一个带有压力字符的奇怪行为。

Syso:

  

添加文件用户:L'equipe技术 - 文件夹:spec eval继续 -   文件名:Capture d'écran2013-05-29à17.24.03.png

如果我打印String我们没有看到任何问题但是当我从String中显示char时,我得到了这个:

  

C a p t e r e d e r r n n

而不是:

  

C a p t e r e d'éc r a n

在数据库中写入字符串时会造成麻烦。我没有生成存档,但我用我的操作系统工具打开它没有问题。这可能是一个编码问题,但我没有看到如何解决它...

BufferedInputStream bis = new BufferedInputStream(is);
        ArchiveInputStream ais = new ArchiveStreamFactory().createArchiveInputStream(bis);

        ArchiveEntry entry = null;
        // Parcours des entrées de l'archive
        while((entry = ais.getNextEntry()) != null) {
            System.out.println("Test one");
            // on va essayer de ne pas traiter les dossier
            if (!entry.isDirectory()) {
                String[] filePath = entry.getName().split("/");
                List<String> filePathList = new ArrayList<String>();
                for (int i=0; i<filePath.length; i++) {
                    filePathList.add(filePath[i]);
                }

                // on recupere le dossier qui doit contenir le fichier
                Folder targetFolder = getTargetFolder(filePathList.subList(0, filePathList.size()-1), rootFolder, user, scopeGroupId);

                String targetFileName = "";
                targetFileName = filePathList.get(filePathList.size()-1);

                //Ajout du fichier
                final int BUFFER = 2048;

                FileCacheOutputStream myFile = new FileCacheOutputStream();
                int count;
                byte data[] = new byte[BUFFER];
                while ((count = ais.read(data, 0, BUFFER)) != -1) {
                    myFile.write(data, 0, count);
                }
                System.out.println("Add File user : "+user.getFullName()+" -- Folder : "+targetFolder.getName()+" -- File Name : "+targetFileName);
                addFile(user, targetFolder, targetFileName, myFile.getBytes());
            }
        }

1 个答案:

答案 0 :(得分:1)

重音字符可以在Unicode中以多种方式表示。您可以使用预先合并é,或者使用简单的e,然后使用组合重音

在您的情况下,使用第二种方法构建文件名。如果您的数据库排序规则没有考虑到这一点,或者数据库未存储在Unicode中,则可能会出现问题。

您可以使用Normalizer类在两种表单之间进行转换。例如:

String normStr = Normalizer.normalize (origStr,Normalizer.Form.NFC);