首页 > 解决方案 > 产生适合作为 Javascript 标识符的清晰编码的文本编码?

问题描述

我正在开发一种工具,它可以读取任意数据文件并根据其数据创建一个表,然后将其存储在数据库中。我想保留列标题。列标题已经是 ASCII 文本(或者可能是 latin1),但它们的字符不是有效的变量名(例如,空格、%),所以我需要以某种方式对它们进行编码。我正在寻找具有以下属性的列标题的编码:

  1. 易读:如果编码文本看起来与未编码文本尽可能相似(即,用于调试),那就太好了。
  2. 合法标识符:我希望编码文本是有效的 JavaScript 标识符(ECMA-262 第 7.6 节)。
  3. 可逆:我希望能够从编码文本中获取准确的原始文本。

我可以想到适用于 3 个案例中的 2 个的方法,但我不知道如何获得所有 3 个。例如,url encoding不会产生合法的标识符名称,我想我可以转换base64为合法的,但事实并非如此清晰易读,我目前所拥有的只是做了一些替换,所以它是不可逆的。

效率不是问题,因此如有必要,我可以将编码和未编码的文本存储在一起。我能想到的最佳选择是使用url encoding百分比,然后将其交换为$. 我认为会有比这更好的选择,但我找不到任何东西。有更好的吗?

标签: javascriptencodingbase64asciiurlencode

解决方案


这对依赖Guava的方法PercentEscaper似乎符合我的要求。Guava没有提供 unescaper,但考虑到我这里的简单需求,我可以只使用一个简单的 URLDecoder。

private static PercentEscaper escaper = new PercentEscaper('',false)

static String getIdentifier(String str) {
    //minimal safe characters, but leaves letters alone, so it's somewhat legible
    String escaped = escaper.escape(str);

    //javascript identifiers can't start with a digit, and the escaper doesn't know the first
    //character has different rules. so prepend a "%3" to encode the digit
    if(Character.isDigit(escaped.charAt(0))){
        escaped = "%3"+escaped
    }

    //a percent isn't a valid in a javascript identifier, so we'll use _ as our special character
    escaped = escaped.replace('%','_');

    return escaped;
}

static String invertIdentifier(String str){
    String unescaped = str.replace('_','%');
    unescaped = URLDecoder.decode(unescaped, "UTF-8");
    return unescaped;
}

推荐阅读