Java实现零宽字符和字符串之间的相互转换

如题,上网找了一圈发现都是用JavaScript实现的,只好自己将JavaScript实现的代码转为Java代码实现:

// String -> 零宽字符
public static String strToZeroWidth(String str){
    String collect = Arrays.stream(str.split(""))
        .map(item -> Integer.toBinaryString(item.charAt(0)))
        .collect(Collectors.joining(" "));
    String result = Arrays.stream(collect.split(""))
        .map(item -> {
            if (item.equals("1")) {
                return "\u200B";
            } else if (item.equals("0")) {
                return "\u200C";
            } else {
                return "\u200D";
            }
        })
        .collect(Collectors.joining(""));
    return result;
}

// 零宽字符 -> String
public static String zeroWidthToStr(String str){
    //去除非零宽字符,只对零宽字符进行转换
    String lkzf = str.replaceAll("[^\u200b-\u200f\uFEFF\u202a-\u202e]", "");
    String collect = Arrays.stream(lkzf.split(""))
        .map(item -> {
            if ("\u200B".equals(item)) {
                return "1";
            } else if ("\u200C".equals(item)) {
                return "0";
            } else {
                return " ";
            }
        })
        .collect(Collectors.joining(""));
    String result = Arrays.stream(collect.split(" "))
        .map(item -> "" + (char) Integer.parseInt(item, 2))
        .collect(Collectors.joining(""));
    return result;
}

// 测试
public static void main(String[] args) {
    String lkzf = strToZeroWidth("中间");
    System.out.println("lkzf = " + lkzf);
    String result1 = "零宽" + lkzf + "字符";
    System.out.println(result1);
    System.out.println(result1.length());
    String result2 = zeroWidthToStr(result1);
    System.out.println("result2 = " + result2);
}

输出:

image-20230116233514769
lkzf = ​‌‌​​​‌‌‌​‌​​‌​‍​‌‌​‌​‌​​​​​‌​‌‌
零宽​‌‌​​​‌‌‌​‌​​‌​‍​‌‌​‌​‌​​​​​‌​‌‌字符
36
result2 = 中间
posted @ 2023-01-16 23:41  harglo  阅读(507)  评论(0编辑  收藏  举报