解码 alfresco 文件名或替换 String/fileName 中的 unicode[_x0020_] 字符
Decode alfresco file name or replace unicode[_x0020_] characters in String/fileName
我正在使用 java 的露天下载上传服务。
当我将文件上传到 alfreco 服务器时,它为我提供了以下路径:
/app:Home/cm:Company_x0020_Home/cm:Abc/cm:TestFile/cm:V4/cm:BC1X_x0020_0400_x0020_0109-_x0028_1-2_x0029__v2.pdf
当我使用相同的文件路径并使用 alfresco 服务下载时,我采用了路径末尾的文件名
i.e ABC1X_x0020_0400_x0020_0109-_x0028_1-2_x0029__v2.pdf
如何删除或解码 fileName
中的 [Unicode] 字符
String decoded = URLDecoder.decode(queryString, "UTF-8");
以上不成立。
这些是出现在我的文件名中的一些 Unicode 字符。
https://en.wikipedia.org/wiki/List_of_Unicode_characters
请不要将问题标记为重复,因为我在下面的链接中进行了搜索,但没有一个给出了解决方案。
以下是我搜索过的用于用 java.
替换 String 中的 unicode 字符的链接
Java removing unicode characters
Remove non-ASCII characters from String in Java
How can I replace a unicode character in java string
在 org.alfresco.util 包中,您会找到一个名为 ISO9075 的 class。您可以使用它根据该规范对字符串进行编码和解码。例如:
String test = "ABC1X_x0020_0400_x0020_0109-_x0028_1-2_x0029__v2.pdf";
String out = ISO9075.decode(test);
System.out.println(out);
Returns:
ABC1X 0400 0109-(1-2)_v2.pdf
如果您想了解它在幕后做了什么,请查看源代码。
Jeff Potts给出的解决方案将是完美的。
但是我有一种情况,我在不同的项目中使用文件名,我不会使用 org.alfresco 相关的 jars
我不得不使用所有这些依赖项来进行简单的文件解码
所以我使用了 java 本机方法,它使用正则表达式来解析文件名并对其进行解码,这给了我与使用
相同的完美解决方案
ISO9075.decode(test);
这是可以使用的代码
public String decode_FileName(String fileName) {
System.out.println("fileName : " + fileName);
String decodedfileName = fileName;
String temp = "";
Matcher m = Pattern.compile("\_x(.*?)\_").matcher(decodedfileName); //rejex which matches _x0020_ kind of charectors
List<String> unicodeChars = new ArrayList<String>();
while (m.find()) {
unicodeChars.add(m.group(1));
}
for (int i = 0; i < unicodeChars.size(); i++) {
temp = unicodeChars.get(i);
if (isInteger(temp)) {
String replace_char = String.valueOf(((char) Integer.parseInt(String.valueOf(temp), 16)));//converting
decodedfileName = decodedfileName.replace("_x" + temp + "_", replace_char);
}
}
System.out.println("Decoded FileName :" + decodedfileName);
return decodedfileName;
}
并使用这个小 java 实用程序来知道是整数
public static boolean isInteger(String s) {
try {
Integer.parseInt(s);
} catch (NumberFormatException e) {
return false;
} catch (NullPointerException e) {
return false;
}
return true;
}
所以上面的代码就这么简单:
示例:
0028左括号U+0028可以看到在link
https://en.wikipedia.org/wiki/List_of_Unicode_characters
String replace_char = String.valueOf(((char) Integer.parseInt(String.valueOf("0028"), 16)));
System.out.println(replace_char);
此代码给出输出:(
,这是一个左括号
这就是我在 java 程序中使用的逻辑。
以上程序将给出与 ISO9075.decode(test)
相同的结果
Output :
fileName : ABC1X_x0020_0400_x0020_0109-_x0028_1-2_x0029__v2.pdf
Decoded FileName :ABC1X 0400 0109-(1-2)_v2.pdf
我正在使用 java 的露天下载上传服务。
当我将文件上传到 alfreco 服务器时,它为我提供了以下路径:
/app:Home/cm:Company_x0020_Home/cm:Abc/cm:TestFile/cm:V4/cm:BC1X_x0020_0400_x0020_0109-_x0028_1-2_x0029__v2.pdf
当我使用相同的文件路径并使用 alfresco 服务下载时,我采用了路径末尾的文件名
i.e ABC1X_x0020_0400_x0020_0109-_x0028_1-2_x0029__v2.pdf
如何删除或解码 fileName
中的 [Unicode] 字符String decoded = URLDecoder.decode(queryString, "UTF-8");
以上不成立。
这些是出现在我的文件名中的一些 Unicode 字符。 https://en.wikipedia.org/wiki/List_of_Unicode_characters
请不要将问题标记为重复,因为我在下面的链接中进行了搜索,但没有一个给出了解决方案。 以下是我搜索过的用于用 java.
替换 String 中的 unicode 字符的链接Java removing unicode characters
Remove non-ASCII characters from String in Java
How can I replace a unicode character in java string
在 org.alfresco.util 包中,您会找到一个名为 ISO9075 的 class。您可以使用它根据该规范对字符串进行编码和解码。例如:
String test = "ABC1X_x0020_0400_x0020_0109-_x0028_1-2_x0029__v2.pdf";
String out = ISO9075.decode(test);
System.out.println(out);
Returns:
ABC1X 0400 0109-(1-2)_v2.pdf
如果您想了解它在幕后做了什么,请查看源代码。
Jeff Potts给出的解决方案将是完美的。 但是我有一种情况,我在不同的项目中使用文件名,我不会使用 org.alfresco 相关的 jars
我不得不使用所有这些依赖项来进行简单的文件解码 所以我使用了 java 本机方法,它使用正则表达式来解析文件名并对其进行解码,这给了我与使用
相同的完美解决方案ISO9075.decode(test);
这是可以使用的代码
public String decode_FileName(String fileName) {
System.out.println("fileName : " + fileName);
String decodedfileName = fileName;
String temp = "";
Matcher m = Pattern.compile("\_x(.*?)\_").matcher(decodedfileName); //rejex which matches _x0020_ kind of charectors
List<String> unicodeChars = new ArrayList<String>();
while (m.find()) {
unicodeChars.add(m.group(1));
}
for (int i = 0; i < unicodeChars.size(); i++) {
temp = unicodeChars.get(i);
if (isInteger(temp)) {
String replace_char = String.valueOf(((char) Integer.parseInt(String.valueOf(temp), 16)));//converting
decodedfileName = decodedfileName.replace("_x" + temp + "_", replace_char);
}
}
System.out.println("Decoded FileName :" + decodedfileName);
return decodedfileName;
}
并使用这个小 java 实用程序来知道是整数
public static boolean isInteger(String s) {
try {
Integer.parseInt(s);
} catch (NumberFormatException e) {
return false;
} catch (NullPointerException e) {
return false;
}
return true;
}
所以上面的代码就这么简单:
示例:
0028左括号U+0028可以看到在link https://en.wikipedia.org/wiki/List_of_Unicode_characters
String replace_char = String.valueOf(((char) Integer.parseInt(String.valueOf("0028"), 16)));
System.out.println(replace_char);
此代码给出输出:(
,这是一个左括号
这就是我在 java 程序中使用的逻辑。
以上程序将给出与 ISO9075.decode(test)
Output :
fileName : ABC1X_x0020_0400_x0020_0109-_x0028_1-2_x0029__v2.pdf
Decoded FileName :ABC1X 0400 0109-(1-2)_v2.pdf