两个视觉上相同的文本位与剪贴板有何不同?

How can two visually identical bits of text be different to the clipboard?

我有一个带有两个相同文件路径(2 条单独的行)的 sublime 文档,如果我复制其中一个,我的应用程序功能可以运行,如果我复制另一个,则它不会。

当我 select 一行并执行 cmd + d 时,您会期望 sublime 按照正常功能突出显示这两行。它不是。在 VC 代码中也是如此,因此这两行有些不同。

我试过了myData.toString() 我尝试了 JSON.parse 但效果不佳 我想不通

这里是违规行。

/Volumes/Macintosh HD/Archive/Work/AE_Scripting/⁨Resources⁩/⁨CEP-Resources-master⁩/⁨CEP_8.x⁩/⁨Documentation

-Works
/Volumes/Macintosh HD/Archive/Work/AE_Scripting/Resources/CEP-Resources-master/CEP_8.x/Documentation

上传示例文件后 post 我现在有了一些新信息,如您所见

http://gravitystaging.com/uploadarea/test/examplefile.txt

这两行现在显示为

/Volumes/Macintosh HD/Archive/Work/AE_Scripting/â¨Resourcesâ©/â¨CEP-Resources-masterâ©/â¨CEP_8.xâ©/â¨Documentation

-Works
/Volumes/Macintosh HD/Archive/Work/AE_Scripting/Resources/CEP-Resources-master/CEP_8.x/Documentation

尽管在任何编辑器中它们看起来都很正常且相同。那么我该如何处理这个字符串来删除它。

我建议您看看使用正则表达式删除所有非字母数字字符。

由于粘贴的文本和其他字符已经是字符串格式,尝试将其解析为 JSON 或调用 .toString() 不会更改变量的任何内容。

如果您在 (MacOS) bash 终端中 cat 您的文件,您将得到相同的行。 运行 encguess examplefile.txt 会告诉你格式是UTF-8。使用 UTF-8 编码在 SublimeText 3 中打开它也会显示相同的行。

但是,如果您切换到 Western (Windows 1252) 编码,那么您将得到与示例中完全相同的错误符号。所以我猜你使用了错误的编码来查看你的文件。

如何在 SublimeText 3 中切换编码: 文件 => 使用编码重新打开 => 选择您的编码 (UTF-8)

编辑
如果你想从给定的字符串中删除错误的字符,你可以使用 String.replace().

str = "/Volumes/Macintosh HD/Archive/Work/AE_Scripting/â¨Resourcesâ©/â¨CEP-Resources-masterâ©/â¨CEP_8.xâ©/â¨Documentation"

console.log("Before: ", str);

str = str.replace(/(â©)|(â¨)/g, "");
console.log("After: ", str);

您的第一个字符串中有一些 Unicode 双向标记字符:U+2068 和 U+2069。您可以使用 Python 中的 ord 函数来检查这些:

>>> [ord(x) for x in '/Volumes/Macintosh HD/Archive/Work/AE_Scripting/⁨Resources⁩/⁨CEP-Resources-master⁩/⁨CEP_8.x⁩/⁨Documentation']
[47, 86, 111, 108, 117, 109, 101, 115, 47, 77, 97, 99, 105, 110, 116, 111, 115, 104, 32, 72, 68, 47, 65, 114, 99, 104, 105, 118, 101, 47, 87, 111, 114, 107, 47, 65, 69, 95, 83, 99, 114, 105, 112, 116, 105, 110, 103, 47, 8296, 82, 101, 115, 111, 117, 114, 99, 101, 115, 8297, 47, 8296, 67, 69, 80, 45, 82, 101, 115, 111, 117, 114, 99, 101, 115, 45, 109, 97, 115, 116, 101, 114, 8297, 47, 8296, 67, 69, 80, 95, 56, 46, 120, 8297, 47, 8296, 68, 111, 99, 117, 109, 101, 110, 116, 97, 116, 105, 111, 110]

看到那些 8000 多的东西了吗?这些是您不需要的 Unicode 标记。

如果您只想要普通的 ASCII,下面是我在 Python 中的做法:

''.join(c for c in my_string if ord(c) < 256)

这将去除高于 U+00FF 的所有内容。

我设法通过以下线程解决了这个问题

How to remove invalid UTF-8 characters from a JavaScript string?

function cleanString(input) {
    var output = "";
    for (var i=0; i<input.length; i++) {
        if (input.charCodeAt(i) <= 127) {
            output += input.charAt(i);
        }
    }
    return output;
}

这是我很早就看过的东西,但一定是用错了。