Java String.codePointAt возвращает неожиданное значение - PullRequest
1 голос
/ 16 октября 2010

Если я использую любые символы ASCII от 33 до 127, метод codePointAt дает правильное десятичное значение, например:

String s1 = new String("#");
int val = s1.codePointAt(0);

Возвращает 35, что является правильным значением.

Но если я попытаюсь использовать символы ASCII от 128 до 255 (расширенный ASCII / ISO-8859-1), этот метод даст неправильное значение, например:

String s1 = new String("ƒ")  // Latin small letter f with hook
int val = s1.codePointAt(0);

Это должно вернуть 159 согласно этой справочной таблице , но вместо этого возвращает 409, почему это так?

Ответы [ 4 ]

5 голосов
/ 16 октября 2010

Но если я попытаюсь использовать символы ASCII от 128 до 255

ASCII не имеет значений в этом диапазоне.Он использует только 7 бит.

Символы Java - это UTF-16 (и больше ничего!).Если вы хотите представить ASCII с помощью Java, вам нужно использовать байтовый массив.

Метод codePointAt возвращает 32-битную кодовую точку.16-битные символы не могут содержать весь диапазон Unicode, поэтому некоторые кодовые точки должны быть разделены на два символа (согласно схеме кодирования для UTF-16 ).Метод codePointAt помогает преобразовывать символы кода в символы.

Я написал приблизительное руководство по кодированию в Java здесь .

2 голосов
/ 16 октября 2010

Символы Java не кодируются в ISO-8859-1.Они используют UTF-16, который имеет те же значения для 7-битных символов ASCII (только значения от 0 до 127).

Чтобы получить правильное значение для ISO-8859-1, вы должны преобразовать вашу строку в байт [] с String.getBytes("ISO-8859-1"); и посмотрите в байтовом массиве.

Обновление

ISO-8859-1 не является расширенным ASCII кодирование, используйте String.getBytes("Cp437");, чтобы получить правильные значения.

0 голосов
/ 16 октября 2010

String.codePointAt возвращает кодовую точку Unicode с указанным индексом.

Юникод-кодовая точка ƒ равна 402, см.

http://www.decodeunicode.org/de/u+0192/properties

So

System.out.println("ƒ".codePointAt(0));

печать 402 верна.

Если вас интересует представление в других кодировках, вы можете распечатать представление байтов символа в других кодировках через getBytes (String charsetName) :

    final String s = "ƒ";
    for (final String csName : Charset.availableCharsets().keySet()) {
    try {
     final Charset cs = Charset.forName(csName);
     final CharsetEncoder encode = cs.newEncoder();
     if (encode.canEncode(s)) 
          {
      System.out.println(csName + ": " + Arrays.toString(s.getBytes(csName)));
          }
        } catch (final UnsupportedOperationException uoe) {
        } catch (final UnsupportedEncodingException e) {
     }
    }
0 голосов
/ 16 октября 2010

в Юникоде

ƒ 0x0192 LATIN SMALL LETTER F WITH HOOK
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...