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=
Ê
≤代码>
π
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());