質問
私のWebアプリケーションで使用しています 2 つまり、異なる言語 英語 と アラビア語.
私は持っています 検索ボックス 名前または名前の一部で検索すると、DBから値を取得するWebアプリケーションでは、 "ホームタウン" ユーザーの
説明:
ユーザーが所属している場合のように 故郷「カリフォルニア」 そして彼はaを検索します 名前 いう "ビクター" 次に、私の質問は最初に 同じ故郷の「カリフォルニア」 そして、持っている人々のリストに "カリフォルニア" 故郷として "ビクター" *名前*検索されます 取得します ユーザーが持っています "カリフォルニア" 彼らとして ホームタウン と "ビクター「名前または名前の一部。
問題 故郷の場合です "カリフォルニア" は 保存 の 英語 値を比較および取得します。だが "カリフォルニア" そうなるでしょう アラビア語で「كاليفورنيا」として保存されています. 。この場合 故郷の比較は失敗します そして、それは値を取得することができません。
私のクエリが両方を見つけて、同じ故郷であり、値を取得することを願っています。出来ますか?
何 代わりの 比較のためにこのロジックについて考える必要があります。私は混乱しています。何か提案をしてください?
編集: *もしそうなはずのアイデアがあります ホームタウン Google翻訳者または音訳を使用して、故郷を別の言語に変更することができます。英語の場合はアラビア語にある場合、または英語の場合はアラビア語に、検索結果に両方に加わります。なにか提案を?*
解決
すべての名前を同じ言語(英語など)に検索し、レブンシュタインの編集距離を使用して、名前の音声表現間の類似性を計算します。クエリをすべての名前と単に比較すると、これは遅くなりますが、データベース内のすべての地名を事前に提出すると、 バルカード・ケラーの木, 、その後、クエリ項から距離を編集することで効率的に検索できます。
このテクニックにより、実際に一致するかどうかによって名前を並べ替えることができます。おそらく、メタホンやダブルメタフォンを使用するよりもこの方法でマッチを見つける可能性が高いですが、実装はより困難です。
他のヒント
遭遇する問題は、2つ以上の言語で情報が必要 /必要であり、アプリケーションのユーザーが両方の言語を使用できるようにしたいということです。考えられるアプローチの1つは、アイテムごとに複数のレコードを保持し、たとえばレコードの場合など、主要なキーの一部として言語コードを含めることです。
id hometown name
001 California Victor
言語コードと保存を紹介できます
id lang hometown name
001 en California Victor
001 ar كاليفورنيا Victor
その後、検索は「カリフォルニア」または「كاليفورنيا」のいずれかと一致します。ID001を提供します。これを使用して、データのすべての翻訳(または現在の出力言語のデータのみ)をロードできます。言語の数と、テーブルを予定する必要がないという追加の利点があります。レコードが知られるようになったら、新しい翻訳を追加できます。
(警告:アラビア語の文字列を繰り返しただけで、読むことができません。また、「AR」もAribicの正しい言語コードではないでしょうが、アイデアが得られます。)
アラビア語はいますか 音 「カリフォルニア」のように?その場合、「音のような」基底で比較する必要があります。
あなたのGoogleの提案はそれも良いものかもしれないように聞こえますが、あなたはそれで遊んで、あなたがその正確さに満足していることを確認してください。ヘブライ語と英語の間でそれがどのように機能するかをテストする際に、私は時々、Googleがヘブライ語に翻訳するときに英語の手紙に英語の地名を残すだけであることに気づきました。
クライアント側のローカリゼーションを使用して値を表示するのはどうですか。または、ラッパークラスを作成します ホームタウン それはオーバーライドします equal(Object)
方法では、カリフォルニアのインスタンスが戻ります true
「California」と「كالرنيا」の両方について(ここで間違いを犯した場合はごめんなさい、上からコピーしてください)。
これは古典的なエンコードの問題のように聞こえます。 ASSASCII以外のキャラクターを転送するたびに、正しくエンコードしていることを確認する必要があります。アラビア語と英語の場合、使用できると思います UTF-8 (しかし、私はアラビア語を知らないので、間違っているかもしれません)。
セットアップでは、おそらく次のポイントがあります。
Browser <-> Servlet container <-> Database
|
System.out
Char(16ビット)がBYTE(8ビット)に変換されるシステムインターフェイスのいずれかで、エンコードが正しいことを確認する必要があります。
サーブレットコンテナへのブラウザ
Webページからリクエストを取得または投稿すると、ブラウザは1)サーバーからのHTTPヘッダー、特に Content-Type: text/html; charset=UTF-8
, 、存在する場合、HTMLメタヘッダーをオーバーライドします <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
.
サーブレットコンテナ側には、httpservletrequest.getParameter()には、サーバー設定で設定する必要がある可能性が高いエンコードがあります。
TomcatのServer.xmlの例
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
maxThreads="2000"
connectionTimeout="20000"
redirectPort="8443" />
データベースへのサーブレットコンテナ
データベースには正しいエンコーディングが必要であるか、ソートなどが正しくありません。
mysqlのmy.cnfの例
[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
, 、第二に、System.outを実行する端子は、UTF-8に設定してサポートする必要があります。 System.outを信用しないでください!
VMの文字列が適切な文字になると、エンコードによって影響を受けません。メモリでは、文字列内のすべての文字は16ビットであり、UTF-8がエンコードできるすべてのcharを(ほぼ)カバーしています。文字列をファイルに書き込み、ファイルを実際に調査することができます 知る あなたがあなたのVMで正しい文字を得た場合。