Java URLEncode给出了不同的结果

Aru*_*run 3 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);
Run Code Online (Sandbox Code Playgroud)

这在Eclipse中给出了这个结果:

p=???
p=%E6%8C%87%E7%94%B2%E6%B2%B9
Run Code Online (Sandbox Code Playgroud)

但是当我从命令行运行相同的代码时,我得到以下输出:

p=???
p=%C3%8A%C3%A5%C3%A1%C3%81%C3%AE%E2%89%A4%C3%8A%E2%89%A4%CF%80
Run Code Online (Sandbox Code Playgroud)

可能是什么问题呢?

Bal*_*usC 9

您的Mac在终端中使用Mac OS Roman编码.在发送到Java之前,使用Mac OS Roman编码而不是UTF-8编码错误地解释了这些中文字符.

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

然后检查Mac OS Roman代码页布局,那些(十六进制)字节代表以下字符:

  • 0xE6 0x8C 0x87 = Ê å á
  • 0xE7 0x94 0xB2 = Á î ?
  • 0xE6 0xB2 0xB9 = Ê ? ?

现在,将它们放在一起并使用UTF-8对它们进行URL编码:

System.out.println(URLEncoder.encode("ÊåáÁî?Ê??", "UTF-8"));
Run Code Online (Sandbox Code Playgroud)

看看它打印的是什么?

%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编码配置完全没问题,但是对于这种情况,您可以通过Window> Preferences> General> Workspace> Text File Encoding进行配置.


更新:我错过了评论:

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

如果这些变量来自文本文件而不是命令行输入 - 正如我最初的预期 - 那么你需要以不同的方式解决问题.显然,您正在使用一个Reader实现,它使用运行时环境的默认字符编码,如下所示:

Reader reader = new FileReader("/file.txt");
// ...
Run Code Online (Sandbox Code Playgroud)

您应该在创建阅读器时明确指定所需的编码.您可以使用InputStreamReader构造函数执行此操作.

Reader reader = new InputStreamReader(new FileInputStream("/file.txt"), "UTF-8");
// ...
Run Code Online (Sandbox Code Playgroud)

这将明确告诉Java /file.txt使用UTF-8而不是运行时环境的默认编码来读取Charset#defaultCharset().

System.out.println("This runtime environment uses as default charset " + Charset.defaultCharset());
Run Code Online (Sandbox Code Playgroud)