对于以下程序,
package io.buffer;
import java.nio.charset.Charset;
public class TestCharSet {
public static void main(String[] args) {
// Print the default Charset
System.out.println("The default charset is: " + Charset.defaultCharset());
}
}
文件编码的默认字符集保存在系统属性file.encoding
中。要更改JVM的文件编码默认字符集,可以使用命令行VM选项-Dfile.encoding
。
带参数的程序:
> java -Dfile.encoding=UTF-8 TestCharSet
给出输出:
The default charset is: UTF-8
带参数的程序:
> java -Dfile.encoding=ascii TestCharSet
给出输出:
The default charset is: US-ASCII
为什么java -Dfile.encoding=UTF-16 TestCharSet
会提供输出��
?
答案 0 :(得分:4)
当我使用0000000 fe ff 00 54 00 68 00 65 00 20 00 64 00 65 00 66
0000020 00 61 00 75 00 6c 00 74 00 20 00 63 00 68 00 61
0000040 00 72 00 73 00 65 00 74 00 20 00 69 00 73 00 3a
0000060 00 20 00 55 00 54 00 46 00 2d 00 31 00 36 00 0a
在我的Mac上运行程序时,我得到以下输出(作为十六进制转储):
file.encoding
所以可能发生的事情是:将if(trim(htmlspecialchars($_POST['name']))){
$name = trim(htmlspecialchars($_POST['name']));
}else{
$name = 'Anonymous';
}
设置为UTF-16会导致Java将UTF-16序列写入控制台,而您的控制台未设置为处理UTF-16输出。前两个字节(它们一起构成Unicode BYTE ORDER MARK)不能正确显示(可能是由于您的控制台字体和/或驱动程序),其余输出在第一个空字节处被截断(同样,到期)到您的控制台软件。)
您可以尝试将程序的输出定向到一个文件,并使用十六进制编辑器查看它,或者更好地了解发生了什么。