0

OS:ハンガリー語のWindows(Windows 1250)

Delphi6Profの下にはありませんWideStringPos, WideStringCopy, WideStringReplace...

しかし、XMLベースのプロジェクトでは、それらを使用する必要があります。

そのため、これらの関数の「ようなもの」を書き込もうとしました。

しかし、私は彼らが私が望むように働いているかどうかはわかりません...

DelphiはWideをAnsiに変換し、バックグラウンドで逆にするため、コードがこれらの副作用から安全であるかどうかはわかりません... :-)

コードは非常に原始的です-私はすぐに解決策が必要です...

 function WideStringCopy(WWhat : WideString; From, HowMany : integer) : WideString;
 var
     i : integer;
     l : integer;
     wc : WideChar;
 begin
     Result := '';

     if WWhat = ''
         then Exit;

     if (HowMany <= 0)
         then Exit;

     if  (From < 1)
         then From := 1;

     l := From + HowMany - 1;
     if l > Length(WWhat)
         then l := Length(WWhat);

     for i := From to l do begin
         wc := WWhat[i];
         Result := Result + wc;
     end;
 end;

 function WideStringPos(WWhere, WWhat : WideString) : integer;
 var
     wscomp : WideString;
     i : integer;
 begin
     Result := 0;
     for i := 1 to Length(WWhere) do begin
         wscomp := WideStringCopy(WWhere, i, LengtH(WWhat));
         if WideSameStr(wscomp, WWhat)
             then begin
                 Result := i;
                 Exit;
             end;
     end;
 end;

 function WideStringReplace(WWhere, WFrom, WTo : WideString) : WideString;
 var
     actpos : integer;
     wcomp : WideString;
     wc : WideChar;
 begin
     Result := '';
     actpos := 1;
     while actpos <= Length(WWhere) do begin
         wcomp := WideStringCopy(WWhere, actpos, Length(WFrom));
         if WideSameStr(wcomp, WFrom) then begin

             Result := Result + WTo;
             inc(actpos, Length(WFrom));

         end else begin

             wc := WWhere[actpos];
             Result := Result + wc;
             inc(actpos);

         end;
     end;
 end;

私はそれについて2つの質問があります:

  1. 確かに悪い結果をもたらす(WideをAnsiにサイレントに変換し、文字を失う原因となる)コードがありますか?

  2. このコードをテストできるキャラクターを知っていますか?

たとえば、chr(XXX)コンバーターがワイドルールを保持しているときに残っているものですが、間違ったコードを作成すると失われます...

あなたが書くすべての情報をありがとう...

4

1 に答える 1

0

このコードをテストできるキャラクターを知っていますか?

Win1250を超えるコードページ(キリル文字のWin1251、ギリシャ語、ヘブライ語など)は、1250/1252からほとんどすべての文字が失われます。

Jedi CodeLibraryを使用して、ロケール変換ルーチンを使用できます。前述のようなエンコーディングで#128から#255で構成される文字列を作成し、そのコードページからUnicodeに変換してから、Unicodeからハンガリー語のコードページに変換し直します。

関数StringToWideStringEx(const S:AnsiString; CodePage:Word):WideString; 関数WideStringToStringEx(const WS:WideString; CodePage:Word):AnsiString;

または1回の呼び出しで

関数TranslateString(const S:AnsiString; CP1、CP2:Word):AnsiString;

次に、どの文字が変換に失敗し、ReplacementCharacterに変わったかを確認します。


ただし、JCLでは、Pos関数などをすぐに使用できます。そしてXMLパーサー。では、なぜわざわざ?

于 2012-09-12T13:57:26.630 に答える