Что может привести к тому, что String.charAt (0) ничего не напечатает и будет иметь тип символа "16"? - PullRequest
0 голосов
/ 12 февраля 2012

Кто-нибудь имеет представление о том, что здесь может происходить?

Первый блок показывает то, что я, как правило, ожидаю увидеть - первый символ строки находится в индексе '0' с закомментированной строкой 'problem', замененной точно такой же вещью, однако никогда не выполнявшейся раньше.

public void finderTest(){
    String theDoc = "Hello, I want this to work, and work well! Do you think it will work, and if not, why not?";
    //String wordOne = "‭abc"; // old, pre-used string, used to hold a comma.
    String wordOne = "abc";// new, never run before with a comma
    String wordTwo = "and";
    System.out.println("Type of character at index '0' in theDoc: "+Character.getType(theDoc.charAt(0)));
    System.out.println("Character at index '0' in theDoc: "+theDoc.charAt(0));
    System.out.println();
    System.out.println("All of wordOne: "+"'"+wordOne+"'");
    System.out.println("Type of character at index '0' in wordOne: "+Character.getType(wordOne.charAt(0)));
    System.out.println("Character at index '0' in wordOne: "+wordOne.charAt(0));
    System.out.println();
    System.out.println("Type of Character at index '0' in wordTwo: "+Character.getType(wordTwo.charAt(0)));
    System.out.println("Character at index '0' in wordTwo: "+wordTwo.charAt(0));
}

Что дает вывод:

/*
    Type of character at index '0' in theDoc: 1
Character at index '0' in theDoc: H

All of wordOne: 'abc'
Type of character at index '0' in wordOne: 2 // okay
Character at index '0' in wordOne: a // okay

Type of Character at index '0' in wordTwo: 2
Character at index '0' in wordTwo: a
*/

Второй блок имеет закомментированную «новую» строку, а первый символ «wordOne» - ничто. Это не нулевой символ или перевод строки. Я использовал эту переменную, чтобы найти запятые в 'theDoc' ... но когда я запустил ее, индекс '0' ничего не содержал, а в индексе 1 была запятая. Если я скопирую и вставлю строку, проблема останется. Однако, комментируя / удаляя его, избавляется от проблемы.

    public void finderTest(){
    String theDoc = "Hello, I want this to work, and work well! Do you think it will work, and if not, why not?";
    String wordOne = "‭abc"; // now running old string, used to hold comma
    //String wordOne = "abc"; 
    String wordTwo = "and";
    System.out.println("Type of character at index '0' in theDoc: "+Character.getType(theDoc.charAt(0)));
    System.out.println("Character at index '0' in theDoc: "+theDoc.charAt(0));
    System.out.println();
    System.out.println("All of wordOne: "+"'"+wordOne+"'");
    System.out.println("Type of character at index '0' in wordOne: "+Character.getType(wordOne.charAt(0)));
    System.out.println("Character at index '0' in wordOne: "+wordOne.charAt(0));
    System.out.println();
    System.out.println("Type of Character at index '0' in wordTwo: "+Character.getType(wordTwo.charAt(0)));
    System.out.println("Character at index '0' in wordTwo: "+wordTwo.charAt(0));
}

Что дает вывод:

/*  
    Type of character at index '0' in theDoc: 1
    Character at index '0' in theDoc: H

    All of wordOne: '‭abc'
    Type of character at index '0' in wordOne: 16 // What does this mean?
    Character at index '0' in wordOne: ‭   // where is the a? (well, its in wordOne index '1'... but why??)

    Type of Character at index '0' in wordTwo: 2
    Character at index '0' in wordTwo: a
*/

Есть ли что-то в запятых или символах в java, что может вызвать такую ​​проблему? Я попытался использовать массивы символов, очистить рабочее пространство, чтобы перестроить все, и ничего не изменилось… Это огромная проблема для поиска индексов «ngrams» в предложениях, когда некоторые граммы - это такие вещи, как «и». В какой-то момент прошлой ночью он работал, а потом неожиданно начал не работать. Я в замешательстве.

Есть идеи?

Спасибо

Andrew

Ответы [ 3 ]

2 голосов
/ 12 февраля 2012

Я попытался вставить ваш пример в Eclipse, и он сказал мне следующее:

Некоторые символы не могут быть сопоставлены с использованием кодировки символов Cp1252.

и указал мне напервый символ в строке:

String wordOne = "abc";

Похоже, что между " и a.

имеется скрытый (не для печати) символ.
1 голос
/ 12 февраля 2012

Тип символа 16 соответствует Unicode DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING (U + 202B). Это непечатный персонаж; Вы можете напечатать это шестнадцатеричное значение для подтверждения.

0 голосов
/ 12 февраля 2012

В вашей строке содержится символ, который вы не можете увидеть (до «а»).В наборе Unicode есть десятки символов, которые не имеют осмысленного визуального представления - это, вероятно, один из них.

Тип символа '16', например:

COMBINING_SPACING_MARK, CONNECTOR_PUNCTUATION, КОНТРОЛЬ, CURRENCY_SYMBOL, DASH_PUNCTUATION, DECIMAL_DIGIT_NUMBER, ENCLOSING_MARK, END_PUNCTUATION, FINAL_QUOTE_PUNCTUATION, FORMAT, INITIAL_QUOTE_PUNCTUATION, LETTER_NUMBER, LINE_SEPARATOR, LOWERCASE_LETTER, MATH_SYMBOL, MODIFIER_LETTER, MODIFIER_SYMBOL, NON_SPACING_MARK, OTHER_LETTER, OTHER_NUMBER, OTHER_PUNCTUATION, OTHER_SYMBOL, PARAGRAPH_SEPARATOR, PRIVATE_USE, SPACE_SEPARATOR, START_PUNCTUATION, SURROGATE, TITLECASE_LETTER, UNASSIGNED, UPPERCASE_LETTER

Все они определены в классе Character.Я не могу сказать вам, какой это, потому что это зависит от реализации в теории;Вы должны проверить по этим значениям.Или, что еще лучше, используйте Character.getName, чтобы найти понятное человеку описание персонажа.

...