【问题标题】:Decode alfresco file name or replace unicode[_x0020_] characters in String/fileName解码露天文件名或替换字符串/文件名中的 unicode[_x0020_] 字符
【发布时间】:2018-11-08 11:12:38
【问题描述】:

我正在使用 java 的 alfresco 下载上传服务。

当我将文件上传到 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

如何删除或解码文件名中的 [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

Java Replace Unicode Characters in a String

【问题讨论】:

    标签: java unicode alfresco decode


    【解决方案1】:

    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 util知道是整数

    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可以在链接中看到 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 
    

    【讨论】:

    • 我在项目外使用服务所以这段代码非常适合我
    【解决方案2】:

    在 org.alfresco.util 包中,您会找到一个名为 ISO9075 的类。您可以使用它根据该规范对字符串进行编码和解码。例如:

        String test = "ABC1X_x0020_0400_x0020_0109-_x0028_1-2_x0029__v2.pdf";
        String out = ISO9075.decode(test);
        System.out.println(out);
    

    返回:

        ABC1X 0400 0109-(1-2)_v2.pdf
    

    如果您想了解它在幕后的作用,请查看源代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 2018-07-18
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2013-02-11
      相关资源
      最近更新 更多