質問が分かりません。現代の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でこの単純なコードを使用すると、メモコントロールを含むアプリケーション構成:
:
Memo1.Clear;
Memo1.Lines.Add(StringOfChar(Char($FE9F), 2));
Memo1.Lines.Add(StringOfChar(Char($062C), 2));
を出力は次のようになります
ご覧のとおり、レンダリングレイヤーは、文字列の先頭に表示されるU + 062C文字で何をすべきかを認識しています。
私見では、これが予想される答えではありません。質問は、 "文字列のchar値を読み取るときにU + 062Cの代わりにU + FE9Fを得るにはどうすればいいですか?" – FileVoyager
@ loursonwinny文字にU + FE9Fが含まれるようにするには、U + FE9Fをcharに入れます。しかし、文字列にU + 062Cが含まれていると、U + 062Cがそこに配置されているためです。文字をある値から別の値に変更する魔法の妖精はありません。言い換えれば、 'S [1]:= Char($ FE9F)'と書くと、 'S [1] = Char($ FE9F)'をアサートすることは安全です。 –
ユニコードで遊ぶのは簡単ではないと思いますが、結束を完成させるためにアラビア語を扱うときにOSが文字列を改造すると思います – FileVoyager