2013-11-23 2 views
1

Я нашел одно сложное место и не нашел ответа, почему это происходит именно так.encodings - отличный результат между кодомPointCount и длиной

Основная проблема в том, как долго это строка.

Содержит ли он один или два символа.

Код:

public class App { 
    public static void main(String[] args) throws Exception { 
     char ch0 = 55378; 
     char ch1 = 56816; 
     String str = new String(new char[]{ch0, ch1}); 
     System.out.println(str); 
     System.out.println(str.length()); 
     System.out.println(str.codePointCount(0, 2)); 
     System.out.println(str.charAt(0)); 
     System.out.println(str.charAt(1)); 
    } 
} 

Выход:

? 
2 
1 
? 
? 

Любые предложения?

+2

Я предлагаю вам потратить некоторое время, пройдя через [эту статью] (http://kunststube.net/encoding/) –

+0

какой вывод вы ожидаете? –

ответ

2

Содержит ли он один или два символа.

Он содержит один Unicode символ, который состоит из 2-х UTF-16 кодовых блоков. Каждый char в Java - это код UTF-16 ... это может быть не полный символ. Каждый символ имеет одну кодовую точку. Unicode предоставляет кодированный набор символов , отображающий каждый символ в целое число, представляющее этот символ (кодовая точка).

length() возвращает количество единиц кода, тогда как codePointCount возвращает количество кодовых точек.

Возможно, вы захотите посмотреть мою статью о encodings in .NET - терминология все переводит отлично (как стандартная терминология), поэтому просто игнорируйте компоненты, специфичные для .NET.

+0

Это именно то, что я искал –

Смежные вопросы