4

私は次の(テスト)を構築しようとしていますWideString

á(U + 00E1小文字ラテン語Aと急性

しかし、それを分解した形で使用する:

ラテン語の小さな文字A(U + 0061)アキュートアクセントの組み合わせ(U + 0301

だから私はコードフラグメントを持っています:

var
    test: WideString;
begin
   test := #$0061#$0301;
   MessageBoxW(0, PWideChar(test), 'Character with diacratic', MB_ICONINFORMATION or MB_OK);
end;

それが機能していないように見えることを除いて:

ここに画像の説明を入力してください

これはのバグである可能性MessageBoxがありますが、先に進んで、バグが私のコードにある可能性が高いと言います。

私が試した他のいくつかのバリエーション:

test := WideString(#$0061#$0301);


const
    SmallLetterLatinAWithAcuteDecomposed: WideString = #$0061#$0301;
test := SmallLetterLatinAWithAcuteDecomposed


test := #$0061+#$0301;  (Doesn't compile; incompatible types)


test := WideString(#$0061)+WideString(#$0301);  (Doesn't compile; crashes compiler)


test := 'a'+WideString(#$0301);  (Doesn't compile; crashes compiler)


//Arnauld's thought:
test := #$0301#$0061;

ボーナスおしゃべり

4

3 に答える 3

11

ベストアンサー:

const
    n: WideString = '';  //n=Nothing

s := n+#$0061+#$0301;

これにより、以下で失敗するすべてのケースが修正されます。


動作する唯一のバリアントは、定数として宣言することです。

AccentAcute: WideString = #$0301;
AccentAcute: WideString = WideChar($0301);
AccentAcute: WideString = WideChar(#$0301);
AccentAcute: WideString = WideString(#$0301);

使用例:

s := 'Pasta'+AccentAcute;

動作しない定数ベースの構文

  • AccentAcute: WideString = $0301;
    互換性のないタイプ
  • AccentAcute: WideString = #0301;
    与えるここに画像の説明を入力してください
  • AccentAcute: WideString = WideString($0301);
    無効な型キャスト
  • AccentAcute: WideString = WideString(#$0301);
    無効な型キャスト
  • AccentAcute: WideChar = WideChar(#0301); 与えるPastai
  • AccentAcute: WideChar = WideChar($0301); 与えるPasta´

失敗する他の構文

  • 'Pasta'+WideChar($0301)
    与えるPasta´
  • 'Pasta'+#$0301
    与えるPasta´
  • WideString('Pasta')+#$0301
    与えるここに画像の説明を入力してください

私が見つけたすべての定数ベースの構文の要約は次のように考えています。

AccentAcute: WideString =            #$0301;   //works
AccentAcute: WideString =   WideChar(#$0301);  //works
AccentAcute: WideString = WideString(#$0301);  //works
AccentAcute: WideString =             $0301;   //incompatble types
AccentAcute: WideString =    WideChar($0301);  //works
AccentAcute: WideString =  WideString($0301);  //invalid typecast

AccentAcute: WideChar =            #$0301;     //fails, gives Pasta´
AccentAcute: WideChar =   WideChar(#$0301);    //fails, gives Pasta´
AccentAcute: WideChar = WideString(#$0301);    //incompatible types
AccentAcute: WideChar =             $0301;     //incompatible types
AccentAcute: WideChar =    WideChar($0301);    //fails, gives Pasta´
AccentAcute: WideChar =  WideString($0301);    //invalid typecast

変数に追加するだけで、再配置WideCharは機能します

//Works
t := '0123401234012340123';
t := t+WideChar(#$D840);
t := t+WideChar(#$DC00);

//fails
t := '0123401234012340123'+WideChar(#$D840);
t := t+WideChar(#$DC00);

//fails
t := '0123401234012340123'+WideChar(#$D840)+WideChar(#$DC00);

//works
t := '0123401234012340123';
t := t+WideChar(#$D840)+WideChar(#$DC00);

//works
t := '';
t := t+WideChar(#$D840)+WideChar(#$DC00);

//fails; gives junk
t := ''+WideChar(#$D840)+WideChar(#$DC00);

//crashes compiler
t := WideString('')+WideChar(#$D840)+WideChar(#$DC00);

//doesn't compile
t := WideChar(#$D840)+WideChar(#$DC00);

コンパイラのナンセンスに間違いなくぶつかる。テストされていないケースは完全にテストされました。はい、私はデビッドを知っています、私たちはアップグレードする必要があります。

于 2011-08-11T19:50:34.957 に答える
2

これはDelphi5/7で機能します。

var
  test: WideString;
begin

   test := WideChar($0061);
   test := test + WideChar($0301);

   MessageBoxW(0, PWideChar(test), 'Character with diacratic', MB_ICONINFORMATION or MB_OK);
end;

要するに:

  • delphi5およびdelphi7では、WideCharsをWideStringに連結することは、#$xxxxフォームリテラルを使用して機能するようには見えません。
  • #Unicodeリテラルに期待するようには機能しないようです。

  • 次のように、1つの式に2つ以上のワイド文字を追加することはできません。

    test := WideChar(a)+WideChar(b);  // won't compile in D5/D7.
    
于 2011-08-11T18:35:31.163 に答える
0

#$ 0301#$ 0061(つまり発音区別符号を最初に)を試しましたか?

わかった。

したがって、#$....このバージョンではASCII8ビット定数のみを処理します。

メモリレベルを使用して回避策を使用できます。

type
    TWordArray  = array[1..MaxInt div SizeOf(word)-2] of word;
    // start at [1], just as WideStrings
    // or: TWordArray  = array[0..MaxInt div SizeOf(word)-1] of word;
    PWordArray = ^TWordArray;

var
  test: WideString;
begin
  test := '12'; // or SetLength(test,2);
  PWordArray(test)[1] := $61; 
  PWordArray(test)[2] := $301;
  MessageBoxW(0, pointer(test), 'Character with diacratic', MB_ICONINFORMATION or MB_OK);
end;

chars / widecharsなどで遊んでいないので、これは常に機能します。

また、DelphiのUnicodeバージョンでも期待どおりに機能します。

于 2011-08-11T17:33:11.710 に答える