2013-11-24 5 views
2

Я запускаю социальную сеть, которая требует, чтобы имена пользователей Unicode были уникальными (как и ожидалось).Преобразование оптически эквивалентных строк Unicode в ASCII в Java?

Некоторые творческие пользователи начали использовать кириллические (и другие) символы Юникода для создания оптически эквивалентных (но unicode различных) имен пользователей.

Например, они будут использовать кириллическую маленькую букву «а», которая выглядит идентичной римской.

Кто-нибудь знает способ автоматического преобразования этих оптически эквивалентных символов в Java? Я бы предпочел не создавать таблицу преобразования вручную, если механизм уже существует.

+0

http://stackoverflow.com/questions/2096667/convert-unicode-to-ascii-without-changing-the-string-length-in-java/2097224#2097224 – user3020494

+0

Это может зависеть от того, какой шрифт используется. Жесткая проблема. – goat

+0

Ответ на данный вопрос не решает проблему. Первый ответ просто удаляет диакритические знаки и преобразует оставшиеся символы, отличные от ASCII, в «?». Второй ответ, касающийся Normalizer.Form.NFD, не влияет на кириллицу буква «а» вообще. – OnesAndZeroes

ответ

1

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

Java, похоже, поддерживает нормализацию Юникода через java.text.Normalizer - больше информации here.

Однако я не уверен, что латинские буквы A и кириллицы A отмечены как эквивалент в Unicode - вам придется попробовать.

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

Существуют также некоторые другие решения - ограничение имен пользователей латинскими алфавитами, например.

+0

Да ... Я пробовал подход Normalizer, и похоже, что латинские буквы a и кириллицы a не отмечены как эквивалентные. Похоже, мне просто нужно создать таблицу преобразования вручную. Облом. – OnesAndZeroes

+0

@OnesAndZeroes Вы ожидали, что они будут? –

1

Почему вы не пытаетесь применить библиотеку OCR.

+0

Да, можно даже статически выполнять OCR и создавать нужные таблицы перевода, а также делать анализ OCR «на лету». –

+0

Я считал что-то писать, чтобы сравнить пиксели между символами, но решил просто пройти через таблицы Юникода вручную. Кажется, что на кириллице, греческом и латинском языках больше всего обидчиков. В конце концов, это было не так уж плохо. – OnesAndZeroes

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