【问题标题】:Strange characters with diff-match-patch libraries带有 diff-match-patch 库的奇怪字符
【发布时间】:2017-02-20 10:55:21
【问题描述】:

我正在使用 diff-match-patch (https://code.google.com/archive/p/google-diff-match-patch/) 来获取两个文本之间的差异。在 diff 结束时,它们返回奇怪的字符:例如 à 变为 %C3%A0ù %C3%B9" %22 等等。

这是我的代码示例:

String startDocument = "hello world";
String endDocument = "àèìòù\"";
diff_match_patch dmp = new diff_match_patch();
dmp.Diff_Timeout = 16;
LinkedList<Diff> diffs = dmp.diff_main( startDocument, endDocument );
String diff = dmp.diff_toDelta(diffs);
System.out.println(diff);      //return: -11 +%C3%A0%C3%A8%C3%AC%C3%B2%C3%B9%22

如何找回原始字符?

【问题讨论】:

    标签: java diff


    【解决方案1】:

    试试

    javac -encoding utf8 DaClass.java
    

    java -Dfile.encoding=utf8 DaClass
    

    【讨论】:

    • 类中操作的其他字符没有错,只有diff函数返回了这个奇怪的字符...
    【解决方案2】:

    这是预期的行为。

    DiffMatchPatch 使用类似于 javascript 的特殊字符编码(来自 the project's wiki):

    2。编码字符

    特殊字符使用 %xx 表示法编码。该组 编码的字符匹配 JavaScript 的 encodeURI() 函数,但未编码的空格除外。

    要对其进行解码,只需查看the code

    // decode would change all "+" to " "
    param = param.replace("+", "%2B");
    try {
        param = URLDecoder.decode(param, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        // Not likely on modern system.
        throw new Error("This system does not support UTF-8.", e);
    } catch (IllegalArgumentException e) {
        // Malformed URI sequence.
        throw new IllegalArgumentException("Illegal escape in diff_fromDelta: " + param, e);
    }
    diffs.add(new Diff(Operation.INSERT, param));
    实际上,您不需要解码相等或删除,因为它不包含它们的 delta 格式的文本。

    如果您只是想显示差异,请查看 diff_prettyHtml 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多