String.getBytes(“ISO-8859-1”)在OS X上给出了16位字符

时间:2010-02-10 08:34:52

标签: java macos unicode ascii

使用Java 6从字符串中获取8位字符:

System.out.println(Arrays.toString("öä".getBytes("ISO-8859-1")));

给我,在Linux上:[ - 10,28] 但OS X我得到:[63,63,63,-89]

当使用花哨的新nio CharSetEncoder类时,我似乎得到了相同的结果。我究竟做错了什么?还是Apple的错? :)

5 个答案:

答案 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命令来计算引擎盖下的内容:filehexdump在这种情况下非常方便。 / p>

您希望在源文件上运行它们,并且可能希望在类文件上运行它们。

答案 3 :(得分:1)

也许没有设置源的字符集(因此根据系统区域设置而不同)?

你能在两个系统上运行相同的编译类(不能重新编译)吗?

答案 4 :(得分:0)

请记住,表示字符的方法不止一种。 Mac OS X默认使用unicode,因此您的字符串文字实际上可能不会由两个字节表示。您需要确保从相应的传入字符集加载字符串;例如,通过在源中指定\ u转义字符。