2014-09-28 2 views
1

Я хочу отобразить символы графический/символ для более простой альтернативы Java, когда это возможно, например:Как я могу отобразить юникод символы в более простой латинский эквивалент сценария в Java

  • U1E36 латинской заглавной буквой л с точкой ниже -> L
  • U25B6 Черный правой Указывая треугольник ->>
  • U25C0 Черный левой Указывая треугольник -> <
  • U25B2 черный UP-Манипулятор треугольник ->^

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

У меня уже есть этот код для удаления акцентов ecetera

public static final Pattern DIACRITICS_AND_FRIENDS 
     = Pattern.compile("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+"); 


private static String stripDiacritics(String str) { 
    str = Normalizer.normalize(str, Normalizer.Form.NFD); 
    str = DIACRITICS_AND_FRIENDS.matcher(str).replaceAll(""); 
    return str; 
} 

Так мне было интересно, если там было что-то подобное, чтобы помочь мне с этими символами символов, обратите внимание, я не хочу, чтобы когда-либо удалить их просто замените его более простым представлением.

+0

За комментарий в другом месте: «Цель состоит в том, чтобы предоставить представление значения, которое может использоваться в имени файла, чтобы оно было более портативным» - посмотрите на [URLEncoder] (http://stackoverflow.com/questions/6230693/URL-кодирования-строка-что-Арент-Валид-URIs). – usr2564301

+0

Спасибо, но это не то, что Imean –

ответ

1

Я нашел этот фильтр Lucene, который пытается сделать то, что я пытаюсь сделать, посмотрев на каждый символ с величиной unicode, превышающей \ u0080, и посмотрел, имеет ли он сопоставление с более простым символом посредством массивного оператора case

http://grepcode.com/file/repo1.maven.org/maven2/org.apache.lucene/lucene-core/2.9.1/org/apache/lucene/analysis/ASCIIFoldingFilter.java

и изменить версию можно найти, загрузив исходный код и глядя в

org.apache.lucene.analysis.miscellaneous 

пакет

Итак, уже предпринята разумная попытка, но довольно сложно определить, какие дополнительные символы они покрывают, которые не покрываются методом Нормализатора.

+0

Последняя ссылка: http://grepcode.com/file/repo1.maven.org/maven2/org.apache.lucene/lucene-analyzers-common/5.2.1/org/apache/lucene/analysis/miscellaneous/ASCIIFoldingFilter .java # ASCIIFoldingFilter.foldToASCII (символ [], Int, символ [], Int, Int) –

1

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

Если вы посмотрите на страницу наподобие LATIN SMALL LETTER U WITH DIAERESIS, вы увидите, какую информацию на самом деле определяет стандарт для данного символа. (Смотрите только на блоке, помеченный Юникод данных.)

Обратите внимание, что это разложения дано в другую последовательность Юникода, однако персонаж может быть представлена ​​либо , как \u00fc или \u0075\u0308. Вы можете механически конвертировать экземпляры первого ко второму, а затем разделить все комбинации меток, однако ...

Теперь посмотрите на что-то вроде CYRILLIC SMALL LETTER DZE, и вы увидите, что, пока оно напечатано с использованием чего-то более-менее точно S, это на самом деле совершенно другая буква. Фактически звук, который он делает, составляет /dz/.

Если вы действительнодействительно хотел сделать это, вам придется буквально написать библиотеку с базой данных, содержащей отображение для каждого символа. Некоторые, как и первый пример выше, вы можете делать полуавтоматически, но другие, подобные второму примеру, не имеют реального четкого отображения.

+0

Спасибо, но речь идет о символах и графических символах, а не диакритики и тому подобное, эта часть уже решена достаточно хорошо для моих целей. Дело в том, чтобы предоставить представление значения, которое может использоваться в имени файла, чтобы оно было более портативным. Обычно эта функция будет использоваться пользователями, которые не могут произносить или понимать исходный язык, а также в графических символах, которые в любом случае неактуальны. –

+1

@PaulTaylor: но базовая * система * - то же самое. Нет никакого «общего» преобразования, которое вы просите, поэтому вы должны создать таблицу преобразования самостоятельно. Каски правильно указал это в своем последнем абзаце. – usr2564301

+0

Я удивлен, что либо я первый, кто хочет того или другого, я не первый, но никто не хочет делиться своим пользовательским преобразованием. –

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