كيفية مقارنة قيم سلسلة اللغة المختلفة في جافا؟

StackOverflow https://stackoverflow.com/questions/4287694

  •  28-09-2019
  •  | 
  •  

سؤال

في تطبيق الويب الخاص بي ، أستخدمه اثنين لغات مختلفة وهي إنجليزي و عربي.

انا املك مربع البحث في تطبيق الويب الخاص بي ، إذا بحثنا بالاسم أو جزء من الاسم ، فسوف يسترجع القيم من DB بمقارنة "مسقط رأس" من المستخدم

تفسير:

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

ال مشكلة إذا كان مسقط رأسه "كاليفورنيا" هو أنقذ في إنجليزي سوف يقارن واسترداد القيم. ولكن "كاليفورنيا" سوف يكون أنقذ كـ "كaaliفonia" باللغة العربية. في هذه الحالة فشلت مقارنة مسقط رأسها ولا يمكن استرداد القيم.

أتمنى أن يجد استفساري كلاهما نفس مسقط رأسه واسترداد القيم. هل هو ممكن؟

ماذا او ما البديل يجب أن أفكر في هذا المنطق للمقارنة. أنا في حيرة. أي اقتراح من فضلك؟

تعديل: *لدي فكرة مثل إذا مسقط رأس هل بعد ذلك ، هل من الممكن استخدام مترجم Google أو مترجم وتغيير مسقط رأسه إلى لغة أخرى. إذا كان باللغة الإنجليزية ، فإن اللغة العربية أو إذا كانت باللغة الإنجليزية ثم إلى اللغة العربية وإعطاء نتائج البحث الانضمام إلى كليهما. أي اقتراح؟*

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

المحلول

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

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

نصائح أخرى

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

id   hometown   name
001  California Victor

يمكنك تقديم رمز لغة وتخزين

id   lang hometown   name
001  en   California Victor
001  ar   كاليفورنيا Victor

بعد ذلك ، سيتطابق بحثك إما "كاليفورنيا" أو "كaaliفornia" يمنحك المعرف 001 ، والذي يمكنك استخدامه بعد ذلك لتحميل جميع ترجمات بياناتك (أو فقط البيانات في لغة الإخراج الحالية.) يمكن استخدام هذا Sceme مع أي Sceme عدد اللغات ولديه ميزة إضافية لا تحتاج إلى مسبق الجدول. يمكنك إضافة ترجمات جديدة للسجلات عندما تصبح معروفة.

(التحذير: لقد كررت للتو سلسلة العربية الخاصة بك ، لا يمكنني قراءتها ، وأيضًا "AR" ليس على الأرجح رمز اللغة الصحيح للأريبيك ولكنك تحصل على الفكرة.)

هل العربية يبدو مثل "كاليفورنيا"؟ إذا كان الأمر كذلك ، فستحتاج إلى المقارنة بين "تشبه الأصوات"-والتي من المحتمل أن تؤدي إلى تحويل صوتي.

يبدو أن اقتراح Google الخاص بك قد يكون أيضًا عرضًا جيدًا ، ولكن يجب أن تلعب معه ، وتأكد من أنك سعيد بدقة. في اختبار كيفية عمله بين العبرية والإنجليزية ، لاحظت أن Google في بعض الأحيان تترك أسماء أماكن باللغة الإنجليزية في رسائل اللغة الإنجليزية عند الترجمة إلى العبرية.

ماذا عن استخدام بعض التوطين على جانب العميل لعرض القيم. أو إنشاء فئة غلاف ل مسقط رأس سوف يتغلب equal(Object) بالطريقة التي ستعود بها مثال كاليفورنيا true لكل من "كاليفورنيا" و "كaaliفornia" (آسف إذا ارتكبت خطأ هنا ، فقط نسخ من الأعلى).

هذا يبدو وكأنه مشكلة تشفير كلاسيكية. كلما قمت بنقل حرف غير ASCII ، تحتاج إلى التأكد من ترميزها بشكل صحيح. للعربية والإنجليزية ، أظن أنه يمكنك استخدامها UTF-8 (لكنني لا أعرف اللغة العربية ، لذلك قد يكون من الخطأ).

في الإعداد الخاص بك ، من المحتمل أن يكون لديك النقاط التالية:

Browser <-> Servlet container <-> Database
                   |
                System.out

في أي من واجهات النظام حيث يتم تحويل chars (16 بت) إلى بايت (8 بت) ستحتاج إلى التأكد من أن الترميز صحيح.

متصفح إلى حاوية servlet

عندما تحصل على طلبات أو نشرها من صفحة ويب ، سينظر المتصفح إلى 1) رؤوس HTTP من الخادم ، وخاصة Content-Type: text/html; charset=UTF-8, ، الذي إذا كان موجودًا ، سيتجاوز رأس HTML Meta <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">.

على جانب حاوية servlet ، سيكون لدى httpservletrequest.getParameter () ، ترميزًا على الأرجح تحتاج إلى تعيينه في إعدادات الخادم.

مثال على tomcat server.xml

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
           maxThreads="2000"                
           connectionTimeout="20000" 
           redirectPort="8443" />

حاوية servlet إلى قاعدة البيانات

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

مثال my.cnf ل mysql

[mysqld] 
 ....
init_connect=''SET collation_connection = utf8_general_ci'' 
init_connect='SET NAMES utf8' 
default-character-set=utf8 
character-set-server = utf8 
collation-server = utf8_general_ci 

[mysql] 
 ....
default-character-set=utf8 

ثم يجب تعيين سائق JDBC لـ UTF-8.

مثال على سلسلة اتصال JDBC

jdbc:mysql://localhost:3306/rimario?useUnicode=true&characterEncoding=utf-8

System.out

System.out.printnln() لا يمكن الاعتماد عليها للتحقق من الأشياء. أولاً ، يعتمد ذلك على الترميز الافتراضي Java VM ، تعيينه باستخدام System.Property -Dfile.encoding=UTF-8, ، ثانياً ، ستحتاج المحطة التي تقوم فيها بالنظام. لا تثق في النظام.

بمجرد أن تكون السلسلة في VM شخصية مناسبة ، لن تتأثر بالترميز. في الذاكرة ، يكون كل char في سلسلة 16 بت ، والذي يغطي (تقريبًا) جميع chars التي يمكن أن تشفرها UTF-8. يمكنك كتابة السلسلة إلى ملف والتحقيق في الملف حقًا أعرف إذا كنت قد حصلت على chars صحيحة في VM الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top