1

質問: 値による Unicode 拡張シンボルの正しい順序は?

Unicode 文字のリストを並べ替えると、Excel の "=code()" を使用してそれらの値で並べ替える場合とは順序が異なります。目的は、文字間の距離を測定することです。たとえば、 ab = 1 と &-% = 1; です。Excel の並べ替え関数で並べ替えると、3 つ以内に並べられた 2 つの文字が 134 離れた値を持つように見えます。

また、一部の char 記号は Excel で空白であり、いくつかは 'find' で 2 回検出され、2 つの異なる記号であり、いくつかはまったく検出されません。これらの「特殊な」文字の詳細を説明してください。

http://en.wikipedia.org/wiki/List_of_Unicode_characters

サンプルコード:

int charDist = abs(alpha[index] - code[0]);

編集: C++ vs2008 の UNICODE 値を把握するために、コード 1 からコード 255 までの各コードをコード 1 に対する比較として実行しました。

cout << mem << " code " << key << " is " << abs(key[0] - '') << " from " << endl;

角かっこの中は、この Web サイトにはフォントがありませんが、コマンド ウィンドウにはある黒いハッピー フェイスです。Excel は空白のままです。

次の Unicode は、std ライブラリと #include 9、10、13、26、34、44 を含む c++ vs2008 では処理されません。

また、コード 1 から 127 までの数値の「距離」は正しいのですが、128 では距離が余分にスキップされ、何らかの理由でさらに 1 つ離れています。次に、128 から 255 で距離が逆転し、近づきます。255 は 1 から 2 離れています ''

これらがより論理的な何かに従っていて、しゃっくりやスキップや反転のない 1 から 255 だけで、255-1 = 254 だったらいいのですが、ねえ、私は何を知っていますか.

EDIT2:私はそれを見つけました-絶対なしで-UNIFORMATの照合は128から255、次に1から127であり、ゴミである9、10、13、26、34、44の6つのスキップで1から255を生成します。それは直感的ではありませんでした。新しい順序 128->255,1->127 では、127 から 128 への奇妙なスキップがより明確になります。これは、0 がないため、255 と 1 の間の値が欠落しているためです。

解決策: 各シンボルの値を使用して独自のハッシュテーブルを作成し、UNIFORMAT のいくつかの特定のサブセットの外側で文字距離を測定するのに正しくないため、UNIFORMAT 値を提供するために C++ std ライブラリまたは vs2008 に依存しないでください。

4

2 に答える 2

4

Unicode には、ソート (または照合) 順序が定義されていません。Excel の並べ替えでは、現在選択されている言語に基づいたテーブルが使用されます。たとえば、英語モードで Excel を使用しているユーザーは、ポルトガル語で Excel を使用しているユーザーとは異なる並べ替え結果を取得する場合があります。

ノーマライゼーションの問題もあります。Unicode では、1 つの「文字」が必ずしも 1 つの値に対応するとは限りません。一部の文字は、さまざまな方法で表すことができます。たとえば、大文字のオメガは、ギリシャ文字または電気抵抗の単位を表す記号としてコード化できます。一部の言語では、1 つの文字が複数の連続した値から構成されている場合があります。

空白の値は、フォント カバレッジがないグリフに対応している可能性があります。一部のシステムでは、すべてのスクリプトに必要なグリフの大部分を含む、いわゆる「Unicode フォント」を使用しています。現在のフォントに必要なグリフがない場合、Windows はオンザフライでフォントを切り替える傾向があります。どちらのアプローチも、必要なすべてのグリフを備えているわけではありません。また、一部の Unicode 値は目に見えるグリフにエンコードされず (たとえば、Unicode にはさまざまな種類のスペースがあります)、一部の値は ASCII スタイルの制御コードのように振る舞います (たとえば、段落区切りまたは双方向制御)。多くの「結合」アクセントのように、別の文字と結合する場合にのみ意味があります。

したがって、あなたが満足する答えはありません。おそらく、最終的に何をしようとしているのかについてより多くの情報を提供していただければ、別のアプローチを提案できるかもしれません.

于 2012-10-05T20:16:05.753 に答える
1

アプローチを大幅に制限することなく、Excel でやりたいことを実行できるとは思いません。

実験により、Code 関数は 255 を超える値を返すことはありません。この VBA コードで生成できない Unicode テキストを使用すると、疑問符 (?) または 63 として解釈されます。

For x = 1 To 255
    Cells(x, 1).Value = Chr(x)
Next

コードを使用して違いを判断できるはずです。ただし、文字がその領域に収まらない場合は、VBA でさえ他の Unicode 文字を疑問符 (?) または 63 に変換するため、Excel の外に移動する必要があります。

于 2012-10-05T20:19:47.567 に答える