2013-05-15 11 views
8

3桁のアラビア語(جبل)を考えてみましょう。ユニコード変換値がDELPHIの文字列にアラビア文字を1つ取得する方法は?

-the最初の文字は -nameは(ǧīm)で、جで、 -its Unicode値は、その冒頭で、 -its基本値は062Cと -its孤立値であるときFE9FあるFE9Dですが、最後の2つの値は同じ形状図を返します。

今、私はそれを単一の文字として取得しようとすると、さまざまな方法でDelphiが基本的なUnicode値を返します。 それは意味がありますが、変換の際にcharには何が起こりますか?それは文字列内にあるときだけ変換された値を取るように見えるが、どこに?どのように抽出するのか?どのプロセスがこれらの値を決定するのか? 再度メインの質問: アラビア語の文字またはそのUnicode値を文字列内のままにするにはどうすればできますか?

アラビア語では、英字とは異なり、大文字と小文字が区別されます(分離、開始、中間、終了)。

答えて

3

質問が分かりません。現代のUnicodeバージョンのDelphiで、U+FE9FをDelphiのソースコードで書く方法を知りたい場合。各コードポイントので、上記のコードは、あなたの特定の単語の罰金であることを

const 
    MyWord = 'جبل'; 
var 
    c: Char; 
.... 
c := MyWord[1];//this is U+062C 

注:あなたがجبلから個々の文字を読みたい

Char($FE9F) 

場合、このようにそれを実行します。単純にそうようにということですか単一のUTF-16 WideChar文字要素でエンコードすることができます。コードポイントに複数の要素が必要な場合は、コードポイントレベル処理のためにUTF-32に変換することをお勧めします。


ここで、質問に含める文字列を見てみましょう。 wgetを使用してこの質問をダウンロードし、ワイヤーを下ろしたファイルはUTF-8でエンコードされていました。私はNotepad ++を使ってUTF16-LEに変換し、あなたの文字列の3つのUTF-16文字を選んだ。彼らは次のとおりです。

 
U+062C 
U+0628 
U+0644 

あなたは次のように述べています

を最初の文字は、名前が(ǧīm)で、そのUnicode値がU + FE9Fあるجです。

しかし、それは単に間違っています。上記からわかるように、投稿した実際のキャラクターはU + 062Cでした。だから、あなたの最初のキャラクターを読み込もうとする理由は、U + 062Cは本当にあなたの文字列の最初の文字です。


最終行は、あなたのDelphiコードではあなたの文字を変換するものは何もないということです。するとき:

S[1] := Char($FE9F); 

コンパイラは単純な2バイトコピーを実行します。発生するコンテキスト認識変換はありません。同様に、S[1]を読むとき。


のは、これらの文字が表示されている方法を見てみましょう、VCLでこの単純なコードを使用すると、メモコントロールを含むアプリケーション構成:

enter image description here

Memo1.Clear; 
Memo1.Lines.Add(StringOfChar(Char($FE9F), 2)); 
Memo1.Lines.Add(StringOfChar(Char($062C), 2)); 

を出力は次のようになります

ご覧のとおり、レンダリングレイヤーは、文字列の先頭に表示されるU + 062C文字で何をすべきかを認識しています。

+1

私見では、これが予想される答えではありません。質問は、 "文字列のchar値を読み取るときにU + 062Cの代わりにU + FE9Fを得るにはどうすればいいですか?" – FileVoyager

+0

@ loursonwinny文字にU + FE9Fが含まれるようにするには、U + FE9Fをcharに入れます。しかし、文字列にU + 062Cが含まれていると、U + 062Cがそこに配置されているためです。文字をある値から別の値に変更する魔法の妖精はありません。言い換えれば、 'S [1]:= Char($ FE9F)'と書くと、 'S [1] = Char($ FE9F)'をアサートすることは安全です。 –

+0

ユニコードで遊ぶのは簡単ではないと思いますが、結束を完成させるためにアラビア語を扱うときにOSが文字列を改造すると思います – FileVoyager

0

文字列/ char関連のメソッドを使用して行うことはできません。しかし、pcharを使うと、おそらくメモリにアクセスしてPwordの値を直接読み取ることができます

EDIT:私はDavidと議論した後、あなたはいつも文字の基本的な/孤立した価値を得ると思います。グリフの開始または終了が使用されるという事実は、おそらくOSの表示フレームワークによって処理されるだけです。

+0

あなたの言うことを裏付けるいくつかのコードを書くだけで十分です。 'S [1] = Char($ FE9F)'を実行する簡単なプログラムを書いて、デバッガで何が起こるかを見てください。これは単純なメモリコピーです。 –

+0

残念ながら私は現時点でどこでプレーするのかIDEはありません。おそらく今夜。しかし、私は自分が経験したのでOPが言ったことを信じていますAFAIR – FileVoyager

+0

私は言ったことを信じますが、私はまた、S [i]:= Char($ FE9F) '$ FE9F'のすでに述べたように、それは文字列の内容から分離された単純なメモリ書き込みです。 –

0

Windowsでの表示用のアラビア文字のシェイプはUniscribeサービス(USP10.dll)によって提供されます。 UniScribe

あなたは便利な次のブログ記事を検索することがあります。 Roozbeh's Programming Blog

+0

ありがとうございます。私は非常に近い気分です。これをやってみましょう: – Hasan

関連する問題