Copy('あいうえお',2,2);で、「い」が取り出せない

解決


keye  URL  2005-05-02 04:52:54  No: 14576

毎度お世話になってます
題名の通り
Copy('あいうえお',2,2);
としても、「い」が返ってきません
何がいけないんでしょうか?
またほかに策はありませんか?
よろしくお願いします


脱力  2005-05-02 05:05:50  No: 14577

Edit1.Text := Copy('あいうえお', 3, 2);


keye  URL  2005-05-02 06:41:47  No: 14578

本当だ、なりますね
ありがとうございます
でもなんで、スタートの位置が奇数になるんですか?
ひらがなって2バイト文字ですよね?


大豆くん  2005-05-02 08:00:13  No: 14579

>  でもなんで、スタートの位置が奇数になるんですか?

Delphiでは、0から始まる物が多いですが、string型の
文字の最初のインデックスは1からです。

PChar型だと0からです。


keye  URL  2005-05-02 09:02:26  No: 14580

そうなんですか
ありがとうございます
文字数+1でインディックスになるんですね


大豆くん  2005-05-02 18:14:17  No: 14581

>文字数+1でインディックスになるんですね
???

半角文字なら  1バイトコピー
全角なら  2バイトコピーです
s : string;

わからないなら
Wstringに代入して、半角全角とわず1文字処理するか
JPos,JCopyを使うといいです
http://www.tt.rim.or.jp/~muramatu/delphi/JSTRM/JSTRM.PAS


余計なお世話・・・  2005-05-02 23:07:29  No: 14582

既に終わってますね
2Byteの文字処理ですね。

Copy(WideString(Edit1.Text),1,1)
または
var
  wStr :WideString;
begin

という手軽な方法もあります。
つまりStringをWideStringに変えると
1Byte文字(半角英数字)や2Byte文字
(全角英数字や日本語)混ざっても文字
数で適切に処理できます。

Stringのままだと1Byte単位で処理され
ますので2Byte文字が入ったとき正しく
表示されません。


余計なお世話・・・  2005-05-02 23:12:43  No: 14583

すいません。
間違って送ってしまいました。
なので、続きです。

既に終わってますね
2Byteの文字処理ですね。

ShowMessage(Copy(WideString(Edit1.Text),1,1));
または
var
  wStr :WideString;
begin
  wStr := Edit1.Text;
  ShowMessage(Copy(wStr,1,1))
      ・
      ・
      ・

という手軽な方法もあります。
つまりStringをWideStringに変えると
1Byte文字(半角英数字)や2Byte文字
(全角英数字や日本語)混ざっても文字
数で適切に処理できます。

Stringのままだと1Byte単位で処理され
ますので2Byte文字が入ったとき正しく
表示されません。


大豆くん  2005-05-03 20:53:45  No: 14584

uses jstrm;

procedure TForm1.Button1Click(Sender: TObject);
  var s : String;
      i ,CopyLen : Integer;
begin
  Memo1.Clear;
  s := 'あいうえお';

  // ☆
  Memo1.Lines.Add(
     jstrm.JCopy(s,2,1) );

  // △
  Memo1.Lines.Add(
    Copy(s  , jstrm.MtoB(s,2) ,2)
    );

  // IsDBCSLeadByte
  // 1バイト目判定  面倒なので jCopyをお勧めします
  if IsDBCSLeadByte(Byte(s[3])) then CopyLen := 2
            else CopyLen := 1;
  Memo1.Lines.Add(
    Copy(s  , 3 ,CopyLen)
    );

  // ☆
  for i := 1 to jstrm.JLength(s) do
  Memo1.Lines.Add(jstrm.JCopy(s,i,1));

  Memo1.Lines.Add(IntToStr(jstrm.MtoB(s,2)));

end;
        {
jstrm.JCopy(S: String; Index, Count: Integer)
  Countには、バイトではなく「文字数」を指定します。
  '123'でも'123'どちらも3文字です

jstrm.JLength
 戻り値は文字数です。    バイトではありせん。
 JLength('12')は、2が返ってきます

jstrm.MtoB(S: string; AMoji: Integer): Integer;
    S文字列において先頭からAMoji番目の文字(文字数)が
    何バイト目に相当するかを返します。。
    S=123の2なら、AMojiに2を指定するとMtoB(s,2)=、3が返ってきます。
        }


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

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






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