Java 解压奇怪字符(编码?)
Java unzip strange character (encoding?)
当我在 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
写入数据库时出现问题。我没有生成存档,但使用 OS 工具打开它没有问题。这可能是一个编码问题,但我不知道如何解决它...
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 class 在两种形式之间进行转换。例如:
String normStr = Normalizer.normalize (origStr,Normalizer.Form.NFC);
当我在 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
写入数据库时出现问题。我没有生成存档,但使用 OS 工具打开它没有问题。这可能是一个编码问题,但我不知道如何解决它...
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 class 在两种形式之间进行转换。例如:
String normStr = Normalizer.normalize (origStr,Normalizer.Form.NFC);