Настройка турецкого и английского языков: перевод турецких символов на латинские эквиваленты

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

String myString="YAŞAT BAYRI";
Locale trlocale= new Locale("tr-TR");
Locale enLocale = new Locale("en_US");

Log.v("mainlist", "en source: " +myString.toLowerCase(enLocale));
Log.v("mainlist", "tr source: " +myString.toLowerCase(trlocale));

Вывод:

en source: yaşar bayri

tr source: yaşar bayri

Но я хочу иметь такой вывод:

en source: yasar bayri

tr source: yaşar bayrı

Возможно ли это на Java?

Ответ 1

Если вы используете конструктор Locale, вы можете и должны указать язык, страну и вариант как отдельные аргументы:

new Locale(language)
new Locale(language, country)
new Locale(language, country, variant)

Поэтому ваша тестовая программа создает локали с языком "tr-TR" и "en_US". Для вашей тестовой программы вы можете использовать new Locale("tr", "TR") и new Locale("en", "US").

Если вы используете Java 1.7+, то вы также можете анализировать языковой тег с помощью Locale.forLanguageTag:

String myString="YASAT BAYRI";
Locale trlocale= Locale.forLanguageTag("tr-TR");
Locale enLocale = Locale.forLanguageTag("en_US");

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

Ответ 2

Я думаю, что это проблема:

Locale trlocale= new Locale("tr-TR");

Попробуйте это вместо:

Locale trlocale= new Locale("tr", "TR");

Чтобы конструктор мог указать страну и язык.

Ответ 3

Если вам просто нужна строка в ASCII без акцентов, это может сделать следующее. Сначала акцентированный символ может быть разделен на ASCII char и сочетать диакритическую метку (акцент с нулевой шириной). Тогда только эти акценты могут быть удалены путем замены регулярного выражения.

public static String withoutDiacritics(String s) {
    // Decompose any ş into s and combining-,.
    String s2 = Normalizer.normalize(s, Normalizer.Form.NFD);
    return s2.replaceAll("(?s)\\p{InCombiningDiacriticalMarks}", "");
}

Ответ 4

вы можете сделать это:

Locale trlocale= new Locale("tr","TR");

Первым параметром является ваш язык, а другой - ваша страна.

Ответ 5

Символы ş и s - разные символы. Изменение языка не может помочь вам перевести один в другой. Вам нужно создать таблицу символов с турецкими языками и сделать это самостоятельно. Я однажды сделал это для вьетнамского языка, у которого много таких персонажей. Вам нужно иметь дело с 4 из 5, не так ли? Итак, удачи!