Last Update : 2009/07/xx
文字列から指定のバイトサイズで文字の一部を切り出す関数です。命令名の由来は「string middle」から。HSP2では命令形式でしたが、HSP3では関数形式に変更されてますが、処理内容は変わってません。
strmid(文字列バッファ, 切り出し始めのインデックス, 切り出す文字数)
第1パラメータは切り出し対象となる大元の文字列型変数です。文字列でない場合は、エラー番号6「パラメータの型が違います」になります。
第2パラメータは切り出し始めのインデックスです。インデックス番号は0バイト目から始まります。-1を指定した場合は逆の左側からの文字列切り出しになります。第2パラメータは切り出す文字数です。単位はバイト値になります。
HSPでの文字列切り出し処理は、strmid関数以外にgetstr関数があります。これは改行、NULL文字、指定した1バイト文字を区切りにして文字を切り出すものです。また、HSP 3.2〜では指定区切りで切り出し分解して各変数に代入するsplit命令、指定文字を取り除いた結果を返すstrtrim関数が存在します。
^
文字列が代入された変数から文字を切り出します。関数形式なので結果がそのまま返ります。
data = "abcdefg" ; 先頭から4バイト切り出す mes strmid(data, 0, 4) ; 3バイト目から2バイト分切り出す mes strmid(data, 3, 2) ; 4バイト目から10バイト分切り出す (実際には切り出し可能な2バイト分) mes "[" + strmid(data, 5, 10) + "]" ; 10バイト目から5バイト切り出す (実際には何も切り出されない) mes "[" + strmid(data, 10, 5) + "]"
右側からの文字列切り出しとして第2パラメータに-1を指定する。
data = "abcdefg" ; 後ろ4バイト分を切り出す mes strmid(data, -1, 4) ; 後ろ10バイト分切り出す (実際には切り出し可能な6バイト分) mes strmid(data, -1, 10)
簡単にまとめると、下の赤部分が結果として返ることになります。
大元の文字列 | abcdefg |
strmid(x, 0, 4) |
abcdefg |
strmid(x, 3, 2) |
abcdefg |
strmid(x, 5, 10) |
abcdefg |
strmid(x, 10, 5) |
abcdefg |
strmid(x, -1, 4) |
abcdefg |
strmid(x, -1, 10) |
abcdefg |
2バイト文字の日本語(漢字、ひらがな、全角カタカナ)の場合は、strmid関数のパラメータがバイト単位なので注意が必要です。誤ると、文字データが壊れて文字化けなどが起こりえます。
data = "あいうえお" ; 2文字目から3文字分切り出す mes strmid(data, 2, 6) ; 後ろから2文字分切り出す mes strmid(data, -1, 4)
1バイト文字(半角)と2バイト文字(全角)が混在した文字列を切り出す1つの例です。cnvstow命令で一度Unicode文字に変換した後、memcpy命令で文字列を切り出して、その取得結果をcnvwtos命令で通常の文字列へと戻してます。(ここではstrmid関数は使えません)
// 文字数単位の切り出し例 data = "HSPプログラミング" ; もちろんうまく機能せず文字化け mes strmid(data, 3, 5) ; 大元の文字サイズに合わせて、確保するバッファサイズを調整する必要あり sdim buf1 sdim buf2 index = 3 ; 切り出し始めのインデックス (文字単位) cut = 5 ; 切り出す文字数 (文字単位) cnvstow buf1, data memcpy buf2, buf1, cut * 2, , index * 2 mes cnvwtos(buf2)
Unicode文字は1バイト文字(アルファベット、数字、記号など)が2バイトとして表現されます。たとえば、上の「HSP」はバイト単位で3バイトの長さですが、Unicode文字に変換すると(メモリ上では)6バイトとして表現されます。
strmid関数は切り出し対象となる大元の文字列がちょっとした量なら問題ありませんが、巨大なデータから切り出す必要がある場合はパフォーマンスがよろしくないので、memcpy命令を利用してください。(参考、HSP Help Center)
Copyright © 2005-2011 ゲーム作成ソフトHSPの情報をいろいろと Let's HSP!. All rights reserved.