如何可靠地去除破坏代码的不可见字符?

7

我正在尝试构建一个书签小程序,但遇到了一个问题,我刚刚才能解决:一个\u8203字符,Chrome在我的代码块中(复制到JS控制台后)不友好地告诉我它是一个“无效的字符ILLEGAL”。

幸运的是,Safari告诉我它是一个\u8203

我正在Sublime Text 2编辑器中编辑代码,并尝试通过复制粘贴(我还尝试了TextEdit)来删除它,但失败了。

是否有某个网站可以除去所有非ASCII字符?

当我尝试保存为ISO 8859时,它会将其保存回UTF-8,“因为存在不受支持的字符”。

... 是的,这就是问题所在。摆脱我的不受支持的邪恶字符。

我该怎么办?在十六进制编辑器中编辑文件吗?

顺便说一下,我实际上是通过重新输入代码(源自此网站)来解决它的。


我刚刚进行了一些谷歌搜索,找到了这个这个 - Adi
我认为仅使用Javascript不可能做到这一点(我假设这是您在问题中使用的标签)。但是,您可以编写一个小的Javascript脚本,并借助Flash的一点帮助(我相信有现成的工具可用),该脚本将读取剪贴板,然后进行正则表达式替换,最后再次写入剪贴板。 - Adi
等等,我们是在谈论字符串中的字符吗?还是在谈论代码本身中的字符,比如 if[*] (true){},其中 * 是不可见字符? - Adi
一般来说,我编写的代码不需要ASCII之外的任何内容。实际上,我想保留的唯一字符是QWERTY键盘上可访问的字符。为什么要用我无法轻松输入的语言编写代码呢?考虑到我的遭遇:某些不可见字符(\u8203)卡在文件中,并跟随代码进入剪贴板。通常情况下,包含js文件是没问题的,但当我将刚刚复制的完全相同的代码粘贴到控制台时,浏览器会显示“ILLEGAL CHARACTER OMGWTF”,而且没有行号。 - Steven Lu
1
有没有某个网站可以除了ASCII字符以外的所有字符都去掉?你可以使用这个网站 - Esailija
显示剩余2条评论
4个回答

14

有没有某个网站可以去除所有非ASCII字符?

你可以使用这个网站

你可以使用以下代码来重新创建该网站:

<!DOCTYPE html>
<html>

    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <title>- jsFiddle demo</title>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
        <link rel="stylesheet" type="text/css" href="/css/normalize.css">
        <link rel="stylesheet" type="text/css" href="/css/result-light.css">
        <style type="text/css">
            textarea {
                width: 800px;
                height: 480px;
                outline: none;
                font-family: Monaco, Consolas, monospace;
                border: 0;
                padding: 15px;
                color: hsl(0, 0%, 27%);
                background-color: #F6F6F6;
            }
        </style>
        <script type="text/javascript">
            //<![CDATA[ 
            $(function () {
                $("button").click(function () {
                    $("textarea").val(
                             $("textarea").val().replace(/[^\u0000-\u007E]/g, "")
                    );
                    $("textarea").focus()[0].select();
                });
            }); //]]>
        </script>
    </head>

    <body>
        <textarea></textarea>
        <button>Remove</button>
    </body>

</html>

谢谢。简短而甜美。也许我会在我的网站上实现这个功能。我会添加一些好玩的东西,比如一个报告,显示哪些字符被删除了,以及它们的位置。 - Steven Lu
2
故事的寓意是不要从JSFiddle的Javascript缓冲区中复制。他们在那里使用不可见字符来做奇怪的事情。 - Steven Lu
这是一个答案,它回答了问题。但它只是一个链接,可能会失效。将您的代码添加到答案中,这样当这种情况发生时,它就可以变得有用... - Naftali
非常感谢您的帮助。在我们的网站上,我们的JS代码每一行都有一个"Â"字符。通过您提供的方法过滤代码后,成功去除了该字符。然而,直接使用这个方法会破坏代码的格式,所以添加一个空格可以保持格式并去除错误字符。这是我编辑过的项目版本,加入了一个空格。http://jsfiddle.net/carrzkiss/8pwkLxqa/1/ - Wayne Barron

6

您可以使用正则表达式将0-127之外的所有内容过滤掉。例如,在JavaScript中:

text.replace(/[^\x00-\x7F]/g, "")

x00 = 0, x7f = 127


1
这将仅保留ASCII字符集,因此删除所有非西方Unicode字符。我们只想删除控制字符,而不是外来字母。 - mike nelson

4

我认为最简单的方法就是使用sed

sed -i 's/[^[:print:]]//g' your_script.js
//            ^^^^^ this can also be 'ascii'

或者使用 `tr`。
tr -cd '\11\12\15\40-\176' < old_script.js > new_script.js

@StevenLu,好的,把它看作是白名单。你只想保留ASCII字符,所以你并不关心\u8203。我会在答案中进一步解释。 - Adi
@StevenLu,显然我犯了一个错误。我匹配了你想要的相反的东西。注意:您可以使用任何语言的RegEx来执行相同的操作,您是否安装了phpperl - Adi
我同意 sedtr 是一个可靠的解决方案,但是当我在 Windows 上时怎么办? - Steven Lu
@dda 嗯,是的。这就是 Adnan 的原始示例所做的。 - Steven Lu
我再说一遍,ASCII码是0到127。ASCII码没有超过这个范围的编码点。因此,你使用的表达式“在128-255的ASCII范围内”是没有意义的。 - dda
显示剩余3条评论

0
非技术解决方案:将您的文本粘贴到 Gmail 中的新电子邮件中,然后单击 Tx(清除格式,在格式菜单中)。对我有用。

你可以使用类似Notepad.exe的工具来完成同样的操作。我倾向于使用Vim(可能会将内容粘贴到Sublime Text中,然后保存为文件,再从Vim中打开)。 - Steven Lu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接