سؤال

المشكلة هي أنه كما تعلمون هناك الآلاف من الشخصيات في يونيكود الرسم البياني و أريد تحويل جميع شخصيات مماثلة على الحروف في الأبجدية الإنجليزية.

فعلى سبيل المثال هنا بعض التحويلات:

ҥ->H
Ѷ->V
Ȳ->Y
Ǭ->O
Ƈ->C
tђє Ŧค๓เℓy --> the Family
...

ورأيت أن هناك أكثر من 20 الإصدارات من الحرف A/a.وأنا لا أعرف كيفية تصنيفها.أنها تبدو مثل إبرة في كومة قش.

قائمة كاملة من حرف unicode في http://www.ssec.wisc.edu/~tomw/java/unicode.html أو http://unicode.org/charts/charindex.html .مجرد محاولة التمرير لأسفل لرؤية نماذج من الرسائل.

كيف يمكن تحويل جميع هذه مع جافا ؟ الرجاء مساعدتي :(

هل كانت مفيدة؟

المحلول

وإعادة إرسال منصبي من كيف يمكنني إزالة علامات التشكيل (لهجات) من سلسلة في. NET؟

وهذه الطريقة يعمل بشكل جيد في جافا <م> (بحتة لغرض إزالة علامات التشكيل ويعرف أيضا باسم لهجات) .

وانها اساسا تحويل جميع أحرف معلمة إلى نظرائهم deAccented وتبع ذلك التشكيل الجمع بهم. الآن يمكنك استخدام التعابير المنطقية لتجريدها من التشكيل.

import java.text.Normalizer;
import java.util.regex.Pattern;

public String deAccent(String str) {
    String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD); 
    Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
    return pattern.matcher(nfdNormalizedString).replaceAll("");
}

نصائح أخرى

وانها جزء من <لأ href = "https://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/StringUtils.html#stripAccents٪28java. lang.String٪ 29 "> أباتشي العموم لانج اعتبارا من النسخة. 3.0.

org.apache.commons.lang3.StringUtils.stripAccents("Añ");

وعوائد An

وانظر أيضا HTTP: //www.drillio. كوم / EN / برنامج التنمية / جافا / إزالة-لهجات التشكيل، في أي لغة /

ومحاولة "تحويل كل منهم" هو نهج خاطئ للمشكلة.

أولا، تحتاج إلى فهم حدود ما تحاول القيام به. كما أشار آخرون، التشكيل وهناك لسبب: فهي أساسا الرسائل فريدة من نوعها في الأبجدية من تلك اللغة مع معنى الخاصة بهم / الصوت وما إلى ذلك: إزالة هذه العلامات ليست سوى نفس استبدال الرسائل العشوائية في كلمة إنجليزية. هذا هو حتى قبل أن تذهب إلى النظر في اللغات السيريلية وغيرها من النصوص النصي أساس مثل العربية، والتي ببساطة لا يمكن أن يكون "تحويلها" إلى الإنكليزية.

إذا <م> يجب ، لأي سبب من الأسباب، وتحويل الأحرف، ثم الطريق الوحيد المعقول لهذا النهج لتقليل أولا نطاق المهمة في متناول اليد. النظر في مصدر الإدخال - إذا كنت الترميز تطبيق ل "العالم الغربي" (استخدام جيدة عبارة عن أي)، فإنه من غير المرجح أن كنت في حاجة من أي وقت مضى إلى تحليل الشخصيات العربية. وبالمثل، فإن مجموعة أحرف Unicode يحتوي على مئات من الرموز الرياضية والتصويرية: لا يوجد (سهل) وسيلة للمستخدمين للدخول مباشرة هذه، لذلك يمكنك أن تفترض أنها يمكن تجاهلها

ومن خلال اتخاذ هذه الخطوات المنطقية يمكنك تقليل عدد الأحرف التي يمكن تحليل لدرجة قاموس أساس بحث / استبدال عملية ممكنا. ومن ثم يصبح كمية صغيرة من مملة قليلا عمل خلق القواميس، ومهمة تافهة لإجراء الاستبدال. إذا كانت لغتك تدعم أحرف Unicode الأم (كما يفعل جافا) ويحسن هياكل ثابتة بشكل صحيح، مثل إيجاد ويحل محل تميل إلى أن تكون سريعة تمام الوضوح.

وهذا يأتي من تجربة بعد أن عملت على أحد التطبيقات التي تم المطلوبة للسماح للمستخدمين النهائيين للبحث البيانات الببليوغرافية التي شملت شخصيات التشكيل. صفائف البحث (كما كان في حالتنا) أخذت ربما يوم 1 رجل لإنتاج، لتغطية جميع علامات التشكيل لجميع لغات أوروبا الغربية.

منذ ترميز أن يتحول "الأسرة" إلى "tђє Ŧค๓เℓy" فعال عشوائية لا تتبع أي خوارزمية يمكن تفسير المعلومات Unicode codepoints المعنية ، ليس هناك طريقة لحل هذه حسابيا.

سوف تحتاج إلى بناء خريطة أحرف Unicode إلى الأحرف اللاتينية التي تشبه.وربما كنت يمكن أن تفعل هذا مع بعض الذكية آلة التعلم الفعلي رموزا تمثل Unicode codepoints.ولكن أعتقد أن الجهد سيكون هذا أكبر من يدويا بناء الخرائط.وخاصة إذا كان لديك كمية جيدة من الأمثلة التي يمكنك من خلالها بناء الخرائط.

توضيح:بعض التبديلات في الواقع يمكن حلها عبر بيانات Unicode (مثل إجابات أخرى تثبت) ، ولكن بعض الحروف ببساطة لا معقول بالتعاون مع الأحرف اللاتينية التي تشبه.

أمثلة:

  • "ђ" (U+0452 السيريلية رسالة صغيرة DJE) هو أكثر ارتباطا "د" من "ح", ولكن يستخدم لتمثيل "ح".
  • "Ŧ" (U+0166 اللاتينية حرف T مع السكتة الدماغية) هي ذات الصلة إلى حد ما "T" (كما يوحي الاسم) ولكن يستخدم لتمثيل "F".
  • "ค" (U+0E04 التايلاندية حرف خو KHWAI) ليست ذات الصلة إلى أي الحرف اللاتيني في كل شيء و في المثال الخاص بك يستخدم لتمثيل "a"

تم الإجابة على الطلب الأصلي بالفعل.

ولكن، وأنا على نشر الإجابة التالية بالنسبة لأولئك الذين يمكن أن تبحث عن رمز حرفي عام في ترجمة أي محارف إلى اللاتينية / الإنجليزية في جاوة.

ومعنى ساذج من tranliteration: سلسلة مترجمة في انها النهائي محارف شكل / الهدف يبدو وكأنه سلسلة في انها النموذج الأصلي. إذا كنا نريد في ترجمة أي محارف إلى اللاتينية (الحروف الهجائية الإنجليزية)، ثم ICU4 (مكتبة ICU4J في جافا) سوف قيام بهذه المهمة.

وهنا مقتطف شفرة جافا في:

    import com.ibm.icu.text.Transliterator; //ICU4J library import

    public static String TRANSLITERATE_ID = "NFD; Any-Latin; NFC";
    public static String NORMALIZE_ID = "NFD; [:Nonspacing Mark:] Remove; NFC";

    /**
    * Returns the transliterated string to convert any charset to latin.
    */
    public static String transliterate(String input) {
        Transliterator transliterator = Transliterator.getInstance(TRANSLITERATE_ID + "; " + NORMALIZE_ID);
        String result = transliterator.transliterate(input);
        return result;
    }

إذا كانت الحاجة إلى تحويل "òéışöç-> oeisoc"، يمكنك استخدام هذه نقطة البداية:

public class AsciiUtils {
    private static final String PLAIN_ASCII =
      "AaEeIiOoUu"    // grave
    + "AaEeIiOoUuYy"  // acute
    + "AaEeIiOoUuYy"  // circumflex
    + "AaOoNn"        // tilde
    + "AaEeIiOoUuYy"  // umlaut
    + "Aa"            // ring
    + "Cc"            // cedilla
    + "OoUu"          // double acute
    ;

    private static final String UNICODE =
     "\u00C0\u00E0\u00C8\u00E8\u00CC\u00EC\u00D2\u00F2\u00D9\u00F9"             
    + "\u00C1\u00E1\u00C9\u00E9\u00CD\u00ED\u00D3\u00F3\u00DA\u00FA\u00DD\u00FD" 
    + "\u00C2\u00E2\u00CA\u00EA\u00CE\u00EE\u00D4\u00F4\u00DB\u00FB\u0176\u0177" 
    + "\u00C3\u00E3\u00D5\u00F5\u00D1\u00F1"
    + "\u00C4\u00E4\u00CB\u00EB\u00CF\u00EF\u00D6\u00F6\u00DC\u00FC\u0178\u00FF" 
    + "\u00C5\u00E5"                                                             
    + "\u00C7\u00E7" 
    + "\u0150\u0151\u0170\u0171" 
    ;

    // private constructor, can't be instanciated!
    private AsciiUtils() { }

    // remove accentued from a string and replace with ascii equivalent
    public static String convertNonAscii(String s) {
       if (s == null) return null;
       StringBuilder sb = new StringBuilder();
       int n = s.length();
       for (int i = 0; i < n; i++) {
          char c = s.charAt(i);
          int pos = UNICODE.indexOf(c);
          if (pos > -1){
              sb.append(PLAIN_ASCII.charAt(pos));
          }
          else {
              sb.append(c);
          }
       }
       return sb.toString();
    }

    public static void main(String args[]) {
       String s = 
         "The result : È,É,Ê,Ë,Û,Ù,Ï,Î,À,Â,Ô,è,é,ê,ë,û,ù,ï,î,à,â,ô,ç";
       System.out.println(AsciiUtils.convertNonAscii(s));
       // output : 
       // The result : E,E,E,E,U,U,I,I,A,A,O,e,e,e,e,u,u,i,i,a,a,o,c
    }
}

ووJDK 1.6 يوفر الطبقة java.text.Normalizer التي يمكن استخدامها لهذه المهمة.

وانظر على سبيل المثال هنا

سلسلة اختبار :ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝß

اختبار :

الخيار الأخير هو الأفضل.

هل يمكن أن حاول استخدام unidecode، والذي يتوفر على أنها روبي الأحجار الكريمة ونتيجة ل<ل أ href = "http://search.cpan.org/~sburke/Text-Unidecode-0.04/lib/Text/Unidecode.pm" يختلط = "نوفولو noreferrer"> وحدة بيرل على كبان . في الأساس، وأنها تعمل بمثابة جدول بحث ضخمة، حيث ترتبط كل نقطة رمز يونيكود لحرف ASCII أو سلسلة.

وليس هناك طريقة سهلة أو عامة لتفعل ما تريد لأنها مجرد رأيك شخصي أن هذه الرسائل تبدو لوك الحروف اللاتينية التي تريد تحويلها إلى. هم في الواقع رسالتين منفصلتين مع أسماء مميزة خاصة بهم والأصوات التي تحدث فقط أن ننظر بشكل سطحي مثل بريد إلكتروني اللاتينية.

إذا كنت تريد أن التحويل، لديك لإنشاء جدول الترجمة الخاصة بك على أساس ما خطابات اللاتينية تعتقد أنه يجب تحويل الحروف غير اللاتينية ل.

و(إذا كنت تريد فقط لإزالة علامات diacritial، وهناك بعض الإجابات في هذا الموضوع: <لأ href = "https://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents- من واحد في سلسلة في شبكة "> كيف يمكنني إزالة علامات التشكيل (لهجات) من سلسلة في. NET؟ ولكن يمكنك أن تصف مشكلة أعم)

وانا في وقت متأخر إلى الحزب، ولكن بعد مواجهة هذه المسألة اليوم، وجدت هذه الإجابة أن تكون جيدة جدا:

String asciiName = Normalizer.normalize(unicodeName, Normalizer.Form.NFD)
    .replaceAll("[^\\p{ASCII}]", "");

والمرجعي: https://stackoverflow.com/a/16283863

والمشكلة مع "تحويل" يونيكود التعسفي لASCII هي أن معنى الحرف هو تعتمد على الثقافة. على سبيل المثال، "ß" لشخص الناطقة بالألمانية يجب تحويلها إلى "SS" في حين أن الإنكليزية اللغة ربما تحويله إلى "B".

وأضف إلى ذلك حقيقة أن يونيكود ديه عدة نقاط رمز للنفس رموزا.

والنتيجة هي أن الطريقة الوحيدة للقيام بذلك هي إنشاء جدول ضخمة مع كل حرف Unicode وحرف ASCII الذي تريد تحويله إلى. يمكنك أن تأخذ اختصار عن طريق تطبيع الأحرف مع لهجات التطبيع شكل دينار كويتي، ولكن ليس كل الحروف تطبيع إلى ASCII. وبالإضافة إلى ذلك، لا يونيكود لا يحدد أي أجزاء من الصورة الرمزية هم "لهجات".

وهنا مقتطفات صغيرة من التطبيق الذي يفعل هذا:

switch (c)
{
    case 'A':
    case '\u00C0':  //  À LATIN CAPITAL LETTER A WITH GRAVE
    case '\u00C1':  //  Á LATIN CAPITAL LETTER A WITH ACUTE
    case '\u00C2':  //  Â LATIN CAPITAL LETTER A WITH CIRCUMFLEX
    // and so on for about 20 lines...
        return "A";
        break;

    case '\u00C6'://  Æ LATIN CAPITAL LIGATURE AE
        return "AE";
        break;

    // And so on for pages...
}

وبعد الدرجة لا حيلة:

org.apache.lucene.analysis.miscellaneous.ASCIIFoldingFilter
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top