سؤال

لدينا نظام حيث يقوم العملاء، معظمهم من الأوروبيين، بإدخال النصوص (بتنسيق UTF-8) التي يجب توزيعها على أنظمة مختلفة، ومعظمها يقبل UTF-8، ولكن يجب علينا الآن أيضًا توزيع النصوص على نظام أمريكي يقبل فقط الولايات المتحدة -أسكي 7 بت

لذا سنحتاج الآن إلى ترجمة جميع الأحرف الأوروبية إلى أقرب US-Ascii.هل هناك أي مكتبات جافا للمساعدة في هذه المهمة؟

لقد بدأنا للتو في الإضافة إلى جدول الترجمة، حيث Å (السويدية AA) ->A وما إلى ذلك، وعندما لا نجد أي تطابق للحرف المُدخل، فسنسجله ونستبدله بعلامة استفهام وحاول إصلاح ذلك للإصدار التالي، ولكن يبدو أنه غير فعال للغاية ويجب أن يكون شخص آخر قد فعل شيئًا مشابهًا من قبل.

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

المحلول

ويتم كتابة البرنامج uni2ascii في C، ولكنك ربما يمكن تحويله إلى جاوة مع قليل مجهود. وهو يحتوي على جدول كبير من تقريبية (ضمنا، في تصريحات تبديل الحالة).

ويجب أن تدرك أن هناك مقبول عالميا تقريبية: الألمان أريد منك أن تحل محل كتبها AE، الفنلنديين والسويديين تفضل فقط A. سبيل المثال لديك من <لأ href = "http://en.wikipedia.org/wiki/٪ C3٪ 85 "يختلط =" noreferrer "> Å ليست واضحة إما: أن السويديين ربما مجرد إسقاط عصابة واستخدام A، ولكن الدنماركيين والنرويجيين قد يحب AA تاريخيا الأصح أفضل

نصائح أخرى

ويمكنك القيام بذلك مع ما يلي (من المثال NFD في <لأ href = "http://web.archive.org/web/20070917051642/http://java.sun.com/mailers/techtips/corejava /2007/tt0207.html#1 "يختلط =" noreferrer "> هذا الأساسية تقنية جافا تك نصيحة ):

public static String decompose(String s) {
    return java.text.Normalizer.normalize(s, java.text.Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+","");
}

بدلاً من إنشاء الجدول الخاص بك، يمكنك بدلاً من ذلك تحويل النص إلى نموذج تسوية D، حيث يتم تمثيل الأحرف كحرف أساسي بالإضافة إلى علامات التشكيل (على سبيل المثال، سيتم استبدال "á" بـ "a" متبوعة بتشكيل حاد مدمج ).يمكنك بعد ذلك تجريد كل شيء ليس حرف ASCII.

لا تزال الجداول موجودة، ولكنها الآن من معيار Unicode.

يمكنك أيضًا تجربة NFKD بدلاً من NFD، لاكتشاف المزيد من الحالات.

مراجع:

وردا على الإجابة التي قدمها جو Liversedge ، ولوسين المشار إليها <لأ href = "HTTP: // لوسين ؟ .apache.org / الأساسية / 2_2_0 / المعهد / index.html و غزاله / اباتشي / لوسين / تحليل / ISOLatin1AccentFilter.html "يختلط =" نوفولو noreferrer "> ISOLatin1AccentFilter على لم يعد موجودا : ل

تم استبداله <لأ href = "http://lucene.apache.org/core/old_versioned_docs/versions/3_0_0/api/all/org/apache/lucene/analysis/ASCIIFoldingFilter.html" يختلط = " نوفولو noreferrer "> org.apache.lucene.analysis.ASCIIFoldingFilter :

<اقتباس فقرة>   

هذه الفئة تحويل أبجدية رقمية، ورمزية أحرف Unicode التي ليست في أول 127 حرفا ASCII (و"اللاتينية الأساسية" كتلة يونيكود) إلى مكافئات ASCII، وإذا وجدت. يتم تحويل الأحرف من كتل يونيكود التالية: ومع ذلك، يتم تحويلها فقط تلك الأحرف ببدائل ASCII معقولة.

وFYI -

وهذا مفيد عادة في تطبيقات البحث.انظر لوسين المقابلة ISOLatin1AccentFilter تطبيق.لم يتم تصميم هذا حقًا للتوصيل بتطبيق محلي عشوائي، ولكنه يفي بالغرض.

وهناك بعض المدمج في وظائف للقيام بذلك. الطبقة الرئيسية التي تشارك هي CharsetEncoder ، الذي هو جزء من حزمة nio. وهناك طريقة أبسط هو <وأ href = "http://java.sun.com/javase/6/docs/api/java/lang/String.html#getBytes(java.nio.charset.Charset)" يختلط = "نوفولو noreferrer "> String.getBytes(Charset) التي يمكن إرسالها إلى <لأ href =" http://java.sun.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html "يختلط =" نوفولو noreferrer "> ByteArrayOutputStream .

وسلسلة جديدة ( "½" .getBytes ( "US-ASCII"))

وهذا هو ما يمكنني استخدام:

<?php
function remove_accent($str)  {
#   http://www.php.net/manual/en/function.preg-replace.php#96586
$a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď', 'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ', 'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ', 'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', 'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ', 'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ', 'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ', 'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż', 'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ', 'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ'); 
$b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o'); 
return str_replace($a, $b, $str); 
}

function SEOify($i){
#   http://php.ca/manual/en/function.preg-replace.php#90316
$o          = $i;
$o          = html_entity_decode($o,ENT_COMPAT,'UTF-8');
$o          = remove_accent(trim($o)); 
$patterns   = array( "([\40])" , "([^a-zA-Z0-9_-])", "(-{2,})" ); 
$replacers  = array("-", "", "-"); 
$o          = preg_replace($patterns, $replacers, $o);
return $o;
}
?>

وهذا ما يبدو للعمل:

private synchronized static String utftoasci(String s){
  final StringBuffer sb = new StringBuffer( s.length() * 2 );

  final StringCharacterIterator iterator = new StringCharacterIterator( s );

  char ch = iterator.current();

  while( ch != StringCharacterIterator.DONE ){
   if(Character.getNumericValue(ch)>0){
    sb.append( ch );
   }else{
    boolean f=false;
    if(Character.toString(ch).equals("Ê")){sb.append("E");f=true;}
    if(Character.toString(ch).equals("È")){sb.append("E");f=true;}
    if(Character.toString(ch).equals("ë")){sb.append("e");f=true;}
    if(Character.toString(ch).equals("é")){sb.append("e");f=true;}
    if(Character.toString(ch).equals("è")){sb.append("e");f=true;}
    if(Character.toString(ch).equals("è")){sb.append("e");f=true;}
    if(Character.toString(ch).equals("Â")){sb.append("A");f=true;}
    if(Character.toString(ch).equals("ä")){sb.append("a");f=true;}
    if(Character.toString(ch).equals("ß")){sb.append("ss");f=true;}
    if(Character.toString(ch).equals("Ç")){sb.append("C");f=true;}
    if(Character.toString(ch).equals("Ö")){sb.append("O");f=true;}
    if(Character.toString(ch).equals("º")){sb.append("");f=true;}
    if(Character.toString(ch).equals("Ó")){sb.append("O");f=true;}
    if(Character.toString(ch).equals("ª")){sb.append("");f=true;}
    if(Character.toString(ch).equals("º")){sb.append("");f=true;}
    if(Character.toString(ch).equals("Ñ")){sb.append("N");f=true;}
    if(Character.toString(ch).equals("É")){sb.append("E");f=true;}
    if(Character.toString(ch).equals("Ä")){sb.append("A");f=true;}
    if(Character.toString(ch).equals("Å")){sb.append("A");f=true;}
    if(Character.toString(ch).equals("ä")){sb.append("a");f=true;}
    if(Character.toString(ch).equals("Ü")){sb.append("U");f=true;}
    if(Character.toString(ch).equals("ö")){sb.append("o");f=true;}
    if(Character.toString(ch).equals("ü")){sb.append("u");f=true;}
    if(Character.toString(ch).equals("á")){sb.append("a");f=true;}
    if(Character.toString(ch).equals("Ó")){sb.append("O");f=true;}
    if(Character.toString(ch).equals("É")){sb.append("E");f=true;}
    if(!f){
     sb.append("?");
    }
   }
   ch = iterator.next();
  }
  return sb.toString();
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top