Java URLEncode提供不同的结果

Java URLEncode提供不同的结果,java,character-encoding,url-encoding,Java,Character Encoding,Url Encoding,我有一个代码存根: System.out.println(param+"="+value); param = URLEncoder.encode(param, "UTF-8"); value = URLEncoder.encode(value, "UTF-8"); System.out.println(param+"="+value); 这将在Eclipse中产生以下结果: p=指甲油 p=%E6%8C%87%E7%94%B2%E6%B2%B9 但是,当我从命令行运行相同的代码时,会得到以下

我有一个代码存根:

System.out.println(param+"="+value);
param = URLEncoder.encode(param, "UTF-8");
value = URLEncoder.encode(value, "UTF-8");
System.out.println(param+"="+value);
这将在Eclipse中产生以下结果:

p=指甲油
p=%E6%8C%87%E7%94%B2%E6%B2%B9
但是,当我从命令行运行相同的代码时,会得到以下输出:

p=指甲油
p=%C3%8A%C3%A5%C3%A1%C3%81%C3%AE%E2%89%A4%C3%8A%E2%89%A4%CF%80

可能是什么问题?

您的Mac电脑在终端中使用Mac OS罗马编码。在发送到Java之前,使用Mac OS Roman编码而不是UTF-8编码错误地解释了这些汉字

作为证据,这些汉字存在于以下(十六进制)字节的UTF-8编码中:

  • =
  • =
  • =
然后检查,这些(十六进制)字节表示以下字符:

  • 0xE6 0x8C 0x87=
    Ê
    å
  • 0xE7 0x94 0xB2=
    Á
    î
  • 0xE6 0xB2 0xB9=
    Ê
    π
现在,将它们放在一起,并使用UTF-8对它们进行URL编码:

System.out.println(URLEncoder.encode("指甲油", "UTF-8"));
看它印的是什么

%C3%8A%C3%A5%C3%A1%C3%81%C3%AE%E2%89%A4%C3%8A%E2%89%A4%CF%80

要解决问题,请告诉Mac在终端中使用UTF-8编码。老实说,我不能直接回答这个问题,因为我不做Mac。您的Eclipse编码配置非常好,但是对于这种情况,您可以通过窗口>首选项>常规>工作区>文本文件编码来配置它


更新:我错过了一条评论:


我正在从文本文件中读取值

如果这些变量源于文本文件而不是命令行输入(正如我最初预期的那样),那么您需要以不同的方式解决问题。显然,您使用的是
读取器
实现,它使用的是运行时环境的默认字符编码,如下所示:

Reader reader = new FileReader("/file.txt");
// ...
您应该在创建读取器时显式指定所需的编码。您可以使用构造函数来实现这一点

Reader reader = new InputStreamReader(new FileInputStream("/file.txt"), "UTF-8");
// ...
这将明确告诉Java使用UTF-8而不是运行时环境的默认编码来读取
/file.txt


值如何传递到此代码中?我无法复制您的结果。我只是从命令行中得到了与Eclipse中相同的输出。它可能是特定于平台的,因为这发生在我的mac上。但是它不会发生在我的linux机器上。我正在从文本文件中读取值
System.out.println("This runtime environment uses as default charset " + Charset.defaultCharset());