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

标签 java encoding zip java-io

当我在 java 中解压 zip 文件时,我发现文件名中出现了带有重音字符的奇怪行为。

西索:

Add File user : L'equipe Technique -- Folder : spec eval continue -- File Name : Capture d’écran 2013-05-29 à 17.24.03.png

如果我打印字符串,我们没有看到任何问题,但是当我显示字符串中的字符时,我得到了这个:

C a p t u r e d ’ e ́ c r a n

而不是:

C a p t u 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());
            }
        }

最佳答案

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

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

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

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

关于Java解压奇怪的字符(编码?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28611824/

相关文章:

java - 如何使用 Java Regex 提取 json 字符串中括号内的值

javascript - 下载 XML 源时处理多种编码方案

linux - 将文件添加到perl中的压缩文件夹

java - 为什么在尝试使用 Apache POI 打开 Excel 文件时出现异常 "IOException: ZIP entry size is too large"?

C# ZipArchive - 如何在不写入磁盘的情况下嵌套内部 .zip 文件

java - 在java代码中添加 boolean 值来检查表状态条件

java - jar文件名形式java代码

python - 使用 pyinstaller 文本无法解码

php - MySQL的排序规则仅用于排序吗?

java - 对对象 Java 的 ArrayList 进行排序