毎度お世話になってます
題名の通り
Copy('あいうえお',2,2);
としても、「い」が返ってきません
何がいけないんでしょうか?
またほかに策はありませんか?
よろしくお願いします
Edit1.Text := Copy('あいうえお', 3, 2);
本当だ、なりますね
ありがとうございます
でもなんで、スタートの位置が奇数になるんですか?
ひらがなって2バイト文字ですよね?
> でもなんで、スタートの位置が奇数になるんですか?
Delphiでは、0から始まる物が多いですが、string型の
文字の最初のインデックスは1からです。
PChar型だと0からです。
そうなんですか
ありがとうございます
文字数+1でインディックスになるんですね
>文字数+1でインディックスになるんですね
???
半角文字なら 1バイトコピー
全角なら 2バイトコピーです
s : string;
わからないなら
Wstringに代入して、半角全角とわず1文字処理するか
JPos,JCopyを使うといいです
http://www.tt.rim.or.jp/~muramatu/delphi/JSTRM/JSTRM.PAS
既に終わってますね
2Byteの文字処理ですね。
Copy(WideString(Edit1.Text),1,1)
または
var
wStr :WideString;
begin
という手軽な方法もあります。
つまりStringをWideStringに変えると
1Byte文字(半角英数字)や2Byte文字
(全角英数字や日本語)混ざっても文字
数で適切に処理できます。
Stringのままだと1Byte単位で処理され
ますので2Byte文字が入ったとき正しく
表示されません。
すいません。
間違って送ってしまいました。
なので、続きです。
既に終わってますね
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文字が入ったとき正しく
表示されません。
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が返ってきます。
}
ツイート | ![]() |