Java: String.toCharArray () с символами Юникода - PullRequest
6 голосов
/ 04 октября 2011

Я знаю, что char не может содержать символы Unicode (например, char c = '\ u1023'). Так как же мне поступить

    String s = "ABCDEFG\u1023";
    char[] c = s.toCharArray();

Я хотел бы преобразовать s в CharArray по соображениям производительности, так как мне приходится перебирать каждый символ в потенциально очень длинной строке, которая неэффективна. Все, что достигает того же результата, прекрасно.

Большое спасибо!

EDIT: На самом деле char может содержать символы Unicode. Я просто глупый. Спасибо тем, кто все равно помог.

Ответы [ 4 ]

10 голосов
/ 04 октября 2011

Кто бы вам ни сказал, что в Java char не может содержать символы Юникода, был неправильным :

Значения целых типов являются целыми числами в следующих диапазонах:

  • Для char, от '\u0000' до '\uffff' включительно, то есть от 0 до 65535
5 голосов
/ 04 октября 2011

Три вещи:

  1. Символ, безусловно, может иметь u1023.
  2. toCharArray() вернет массив символов, который практически совпадает с UTF16
  3. Поскольку символ 16-битный, а Юникод охватывает 21 бит, символы вне BMP кодируются как два суррогатных символа. Java 1.5 и более поздние версии имеют API для этого, например String.codePointAt(...). Если вы используете Java 1.4 или более раннюю версию, изучите ICU4J.
1 голос
/ 18 февраля 2017

Java char может содержать большинство символов Unicode, как уже упоминалось другими, но символы вне Базовой многоязычной плоскости (BMP) разбиваются на несколько char с, и обработка их независимо может разбить строку.

Для безопасности вы можете разбить строку на строковый массив:

String[] c = s.codePoints()
    .mapToObj(cp -> new String(Character.toChars(cp)))
    .toArray(size -> new String[size]);

... или используйте isSurrogate, isLowSurrogate и isHighSurrogate методы объекта Character для предотвращения изменения одного char внутри пары:

Character.isSurrogate('a');
1 голос
/ 16 июля 2016

В Java символ по сути является беззнаковым коротким.Чтобы выполнить итерацию по строке, в которой символы Юникода находятся за пределами диапазона, поддерживаемого char (первые 65536), следует использовать следующий шаблон, в котором каждая кодовая точка хранится как int.

for (int i = 0; i < str.length();) {
    int ch = str.codePointAt(i);
    // do stuff with ch...
    i += Character.charCount(ch);
}

Java быларазработан с первоклассной поддержкой первых 65536 символов, что в то время было улучшением по сравнению с C / C ++, который имел первоклассную поддержку только первых 128 или 256 символов.К сожалению, это означает, что приведенный выше шаблон необходим в Java для поддержки символов вне диапазона, которые становятся все более распространенными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...