String.getBytes («ISO-8859-1») дает мне 16-битные символы в OS X - PullRequest
6 голосов
/ 10 февраля 2010

Использование 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 ]

4 голосов
/ 11 февраля 2010

Мне удалось воспроизвести эту проблему, сохранив исходный файл как UTF-8, а затем сказал компилятору, что это действительно MacRoman:

javac -encoding MacRoman Test.java

Я бы подумал, javac по умолчанию будет UTF-8 на OSX, но, возможно, нет. Или, может быть, вы используете IDE и это по умолчанию MacRoman. В любом случае, вы должны заставить его использовать UTF-8.

2 голосов
/ 10 февраля 2010

Ваш исходный файл производит "öä" путем объединения символов.

Посмотрите на это:

System.out.println(Arrays.toString("\u00F6\u00E4".getBytes("ISO-8859-1")))

Это напечатает [-10, -28] так, как вы ожидаете (мне не нравится печатать его таким образом, но я знаю, что это не точка вашего вопроса), потому что там указаны кодовые точки Unicode, высеченные в камне и вашему текстовому редактору запрещено «играть умно», сочетая «о» и «а» с диакритическими знаками.

Как правило, когда вы сталкиваетесь с такими проблемами, вы, вероятно, хотите использовать две команды OS X Un * x, чтобы понять, что происходит под капотом: file и hexdump очень удобны в таких случаях.

Вы хотите запустить их в исходном файле и, возможно, захотите запустить их в своем файле класса.

2 голосов
/ 10 февраля 2010

Какая кодировка исходного файла? 63 - это код для ?, что означает «символ не может быть преобразован в указанную кодировку».

Так что я предполагаю, что вы скопировали исходный файл на Mac и исходный файл использует кодировку, которую не ожидает компилятор Java Java. IIRC, OS X ожидает, что файл будет UTF-8.

1 голос
/ 10 февраля 2010

Может быть, набор символов для источника не установлен (и поэтому отличается в зависимости от локали системы)?

Можете ли вы запустить один и тот же скомпилированный класс в обеих системах (не перекомпилировать)?

0 голосов
/ 10 февраля 2010

Имейте в виду, что существует несколько способов представления персонажей. Mac OS X по умолчанию использует юникод, поэтому ваш строковый литерал может фактически не быть представлен двумя байтами. Вы должны убедиться, что вы загружаете строку из соответствующего входящего набора символов; например, указав в источнике escape-символ \ u.

...