widestringについて

解決


T.Baba  2003-12-27 09:41:32  No: 6422

現在、フリーのソフトを作り、外国の方にも使っていただいています。ソフトではxmlファイルをTStringListを使って開いて自前のParserで解析し、UserはEditコントロールなどから簡単に編集できるようにしているのですが、外国語を扱うときにwidestringを使ったほうが良いのでしょうか?それともstringで十分なのでしょうか?
また、とりあえず今自前のParserではwidestringを使っていますが、そもそもTStringListやAnsiPosなど扱っているのはstringなのでwidestringにしても意味ないのでしょうか?
文字の扱いに対する知識がとぼしく、widestringは具体的にどういう利点が有るのかさえいまいちわからずにやっていますが、よろしくお願いします。


にしの  2003-12-27 10:40:49  No: 6423

外国語といっても、たくさんありますのでなんとも言えません。少なくとも、英語圏であれば、WideStringにするメリットは思い当たりません。
漢字圏の言語であれば、WideStringにするメリットはあると思います。

たとえば、WideStringを使用すると、
'日本語'
も、
'ABC'
も同じ6バイト(終端文字を除く)になります。


T.Baba  2003-12-28 06:46:35  No: 6424

迅速なレスありがとうございます。
同じ6バイトになるとどういった場合にメリットがあるのでしょうか?
また、widestringでなくstringを使った場合のメリットはなんですか?処理速度の向上などですか?
話は多少変わりますが、以下のプログラムをフォームにボタンをひとつ作って実行したところ、Pos()+widestringのみが正しい結果となるんですが、なぜこうなるのかどなたか説明いただけないでしょうか?
質問ばかりですがよろしくお願いします。

procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
  W: widestring;
begin
  S:= 'abcあいう/';
  W:= S;
  Form1.Caption:= 'Pos: ' + IntToStr(Pos('/', S)) +
             ' AnsiPos: ' + IntToStr(AnsiPos('/', S)) +
                ' PosW: ' + IntToStr(Pos('/', W)) +
            ' AnsiPosW: ' + IntToStr(AnsiPos('/', W));
end;


T.Baba  2003-12-28 07:00:11  No: 6425

上の書き込みで質問の意味がわかりにくいかと思ったので追加です。

>同じ6バイトになるとどういった場合にメリットがあるのでしょうか?
例えばstringだとこういった場合にこんな不具合があるけど、widestringをつかえば避けられるでしょ。のような具体的な例をあげていただけると幸いです。

>また、widestringでなくstringを使った場合のメリットはなんですか?処理速度の向上などですか?
widestringが有利ならすべてwidestringを使えばいいと思えるのですが、皆さんはstringをどういう場合にどのようなメリットを思って使っているのか知りたいので質問しました。

よろしくお願いします。


にしの  2003-12-28 07:12:23  No: 6426

> 同じ6バイトになるとどういった場合にメリットがあるのでしょうか?

WideStringでは、2バイトを1文字として扱います。
たとえば、
'日本語ABC'
これの、2文字目は'本'ですし、5文字目は'B'です。
わざわざ、2バイト文字の場合に2バイトで1文字とカウントしなくてもよいというわけです。

Pos()+wideStringとは、Pos('/', W)のことですよね。
Pos('/', S)も正しい値を返していますよ。
厳密に言えば、AnsiPosも正しい値を返しています。T.Babaさんが期待している動作と、実際の動作が違うだけだと思います。

Pos('/', S)では、'abcあいう/'を、
#$61#$62#$63#$82#$A0#$82#$A2#$82#$A4#$2F#$00
と見ています。
ここの中で、[1]が#$61, [2]が#$62で、[10]が#$2F ('/')ですので、Pos('/'. S)は10を返します。

Pos('/', W)では、'abcあいう/'を、
#$0061 #$0062 #$0063 #$3042 #$3044  #$3046  #$002F #$0000
と見ています。
[1]が#$0061, [2]が#$0062で、[7]が#$002F('/')となり、Pos('/',W)では7を返します。

AnsiPosは、内部でAnsiStrPosの差を返しており、PCHARの差=バイト数となるため、WideString(Unicode)では意味のある数字ではなくなります。


にしの  2003-12-28 07:16:02  No: 6427

WideStringのメリットは、多言語に対応できるという点です。
デメリットは、VCLが対応していないという点でしょうか。
速度的には、それこそギガ単位のテキストを、文脈解析するようなものでない限り、WideStringとStringで差はあまりないように思います。
今のPCは性能が良くなっていますし。

VCLで使えない点は、
http://home.ccci.org/wolbrink/tnt/delphi_unicode_controls.htm
こういうコンポーネントを使えば解決できる場合もあります。


T.Baba  2003-12-28 08:18:56  No: 6428

にしの様、ほしい答えをぽんぽんとすばやく返していただいてどうもありがとうございました。大変感謝しております。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加