使用Java 6从字符串中获取8位字符:
System.out.println(Arrays.toString("öä".getBytes("ISO-8859-1")));
给我,在Linux上:[ - 10,28] 但OS X我得到:[63,63,63,-89]
当使用花哨的新nio CharSetEncoder类时,我似乎得到了相同的结果。我究竟做错了什么?还是Apple的错? :)
答案 0 :(得分:4)
我设法通过将源文件保存为UTF-8来重现此问题,然后告诉编译器它确实是MacRoman:
javac -encoding MacRoman Test.java
我原以为javac
会在OSX上默认为UTF-8,但也许不是。或者您可能正在使用IDE并且它默认为MacRoman。无论如何,你必须改为使用UTF-8。
答案 1 :(得分:2)
源文件的编码是什么? 63
是?
的代码,表示“无法将字符转换为指定的编码”。
所以我的猜测是你将源文件复制到Mac并且源文件使用Mac java编译器不期望的编码。 IIRC,OS X将期望该文件为UTF-8。
答案 2 :(得分:2)
您的源文件通过组合字符生成“öä”。
看看这个:
System.out.println(Arrays.toString("\u00F6\u00E4".getBytes("ISO-8859-1")))
这将打印[-10,-28],就像你期望的那样(我不喜欢以这种方式打印它,但我知道这不是你的问题的重点),因为有指定的Unicode代码点,刻在石头上,并且你的文本编辑器不允许通过将'o'和'a'与变音符号组合来“玩智能”。
通常情况下,当您遇到此类问题时,您可能希望使用两个OS X Un * x命令来计算引擎盖下的内容:file
和hexdump
在这种情况下非常方便。 / p>
您希望在源文件上运行它们,并且可能希望在类文件上运行它们。
答案 3 :(得分:1)
也许没有设置源的字符集(因此根据系统区域设置而不同)?
你能在两个系统上运行相同的编译类(不能重新编译)吗?
答案 4 :(得分:0)
请记住,表示字符的方法不止一种。 Mac OS X默认使用unicode,因此您的字符串文字实际上可能不会由两个字节表示。您需要确保从相应的传入字符集加载字符串;例如,通过在源中指定\ u转义字符。