报价单问题

时间:2014-03-26 19:22:09

标签: java unicode

作品

public static void main(String[] args) throws Exception {
    String PATH = "C:\\WINDOWS\\system32\\notepad.exe";
    new ProcessBuilder(PATH).start();
}

不起作用

public static void main(String[] args) throws Exception {
    String PATH = "‪C:\\WINDOWS\\system32\\notepad.exe";
    new ProcessBuilder(PATH).start();
}

Exception in thread "main" java.io.IOException: Cannot run program "‪C:\WINDOWS\system32\notepad.exe": CreateProcess error=2, The system cannot find the file specified

这两个片段看起来完全相同。在第一个示例中,我手动键入路径周围的引号。在后者,破碎的例子中,引号被复制并粘贴在网站上。当我将两个引号复制并粘贴到Unicode character lookup tool时,我两次都得到了相同的结果。

为什么用完全相同的Unicode字符替换Unicode字符会突然修复我的代码?我在这里错过了什么吗?

如果有人认为这些代码段是相同的,请打开您喜欢的IDE并复制并粘贴上面的代码段而不更改单个字符。我在Windows 8计算机上使用NetBeans IDE 7.4。我也试过Eclipse并得到了相同的结果。

2 个答案:

答案 0 :(得分:2)

我很惊讶这个编译。第二段代码在第一个引号前面有一个LEFT-TO-RIGHT EMBEDDING字符(U + 202A)(在引号之外;因此是非法的Java语法)。 (这似乎是由Bhesh Gurung的评论所证实的。)

如果你以某种方式获得了编译代码,那么我怀疑你运行的代码与你在这里发布的代码有点不同:U_202A最终在引号内;因此文件未找到错误。

答案 1 :(得分:1)

您从网站复制并粘贴的代码段中有一些非打印字符混合到文件名中,因此它看起来与键入的字符相同但包含额外的字符。正如您所发现的那样,这通常会导致路径不正确。如果某些程序在从它们复制或粘贴到它们时没有改变可见部分的表示(而其他程序也将删除前导/尾随空格),则会剥离这些非打印字符,但并非所有程序都这样做。

您可以通过将两个片段粘贴到支持Unicode的文本编辑器中并比较长度/字节数(将它们保存到文件并在文本编辑器不报告非打印字符时检查文件大小)来验证这一点。我为第二个片段获得了159的长度,第一个片段只获得了156.