【问题标题】:Transliteration from Cyrillic to Latin ICU4j java [duplicate]从西里尔文音译到拉丁文ICU4j java [重复]
【发布时间】:2013-04-22 19:18:50
【问题描述】:

我需要做一些相当简单但没有哈希映射硬编码的事情。

我有一个 String s,它是西里尔文,我需要一些示例,说明如何使用自定义过滤器将其转换为拉丁字符(给出一个纯拉丁示例,以免在 String s = sniff;我希望它查找 sniff 并将它们更改为其他内容(也可能有组合)。

我可以看到 ICU4j 可以做这种事情,但我不知道如何实现它,因为我找不到任何工作示例(或者我只是愚蠢)。

感谢任何帮助。

谢谢

最好的问候,

PS 我需要批量翻译。我不关心样式或动态音译,只是关于 ICU4j 批量音译器的一些基本示例。

K 我真的明白了。

import com.ibm.icu.text.Transliterator;


public class BulgarianToLatin {


    public static String BULGARIAN_TO_LATIN = "Bulgarian-Latin/BGN";

    public static void main(String[] args) {
        String bgString = "Джокович";

        Transliterator bulgarianToLatin = Transliterator.getInstance(BULGARIAN_TO_LATIN);
        String result1 = bulgarianToLatin.transliterate(bgString);
        System.out.println("Bulgarian to Latin:" + result1);

    }

}

也是基于规则的音译的最后一次编辑(如果您不想使用预先存在的一次或只是想要定制的东西)

import com.ibm.icu.text.Transliterator;

public class BulgarianToLatin {


    public static String BULGARIAN_TO_LATIN = "Bulgarian-Latin/BGN";

    public static void main(String[] args) {
        String bgString = "а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ю я  \n Юлиян Джокович";

        String rules="::[А-ЪЬЮ-ъьюяѢѣѪѫ];" +
        "Б > B;" +
        "б > b;" +
        "В > V;" +
        "ТС > TS;" +
        "Тс > Ts;" +
        "ч > ch;" +
        "ШТ > SHT;" +
        "Шт > Sht;" +
        "шт > sht;" +
        "{Ш}[[б-джзй-нп-тф-щь][аеиоуъюяѣѫ]] > Sh;" +
        "Я > YA;" +
        "я > ya;";
        Transliterator bulgarianToLatin = Transliterator.createFromRules("temp", rules, Transliterator.FORWARD);

        String result1 = bulgarianToLatin.transliterate(bgString);
        System.out.println("Bulgarian to Latin:" + result1);

    }

}

【问题讨论】:

    标签: java transliteration


    【解决方案1】:

    我写了一个将西里尔字母音译为拉丁语的方法,也许这对 smb 有用。

    public static String transliterate(String message){
        char[] abcCyr =   {' ','а','б','в','г','д','е','ё', 'ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х', 'ц','ч', 'ш','щ','ъ','ы','ь','э', 'ю','я','А','Б','В','Г','Д','Е','Ё', 'Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х', 'Ц', 'Ч','Ш', 'Щ','Ъ','Ы','Ь','Э','Ю','Я','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
        String[] abcLat = {" ","a","b","v","g","d","e","e","zh","z","i","y","k","l","m","n","o","p","r","s","t","u","f","h","ts","ch","sh","sch", "","i", "","e","ju","ja","A","B","V","G","D","E","E","Zh","Z","I","Y","K","L","M","N","O","P","R","S","T","U","F","H","Ts","Ch","Sh","Sch", "","I", "","E","Ju","Ja","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < message.length(); i++) {
            for (int x = 0; x < abcCyr.length; x++ ) {
                if (message.charAt(i) == abcCyr[x]) {
                    builder.append(abcLat[x]);
                }
            }
        }
        return builder.toString();
    }
    

    【讨论】:

    • 对于简单的应用程序非常有用。谢谢!
    • 您的 'abcCyr' 数组中有错字,而不是 'Ь' 你写的是 'Б'。
    • 找到匹配项后即可中断。否则你会做很多不必要的比较。 HashMap 应该比一遍又一遍地迭代同一个数组提供更好的性能,特别是对于更长的字符串,但是如果你想保留数组,你不需要在两个数组中重复拉丁字符。如果找不到匹配项,只需将原始字符复制到 StringBuilder 中即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2021-03-13
    相关资源
    最近更新 更多