|
すみません。途中で投稿してしまいました。
しかも半角カタカナ文字のことをすっかり忘れていました。
半角カタカナを考慮すると最大3文字までバックトラックを
かける必要がありますね(多分(^^;)。
なお、下記のコメント内で
リード文字は 2バイト文字の1バイト目になりうる文字
トレイル文字は2バイト文字の2バイト目になりうる文字
を意味します。
#is_2byte_char = 0;
// このルーチンではShift-JIS文字列として意味を持つ
// 文字列に対してのみ有効です。
#len = strlen($s);
if (#len >= 2) {
#c1 = char(rightstr($s, 1));
call IsCharTrailByte #c1;
if (##return) {
// 最後の文字がトレイル文字になりうる
// 文字だった場合
call IsCharOneByteStuff #c1;
if (!##return) {
// トレイル文字にしかなりえない文字だった
#is_2byte_char = 1;
} else {
#c2 = char(midstr($s, #len - 2, 1));
call IsCharLeadByte #c2;
if (##return) {
// 最後から2番目の文字がリード文字に
// なりうる文字だった場合
// (この時点で #c2 は1バイト文字ではありえない)
if (#len == 2) {
// 全部で2バイトしかないため2バイト文字であることが
// 確定する。
#is_2byte_char = 1;
} else {
call IsCharTrailByte #c2;
if (!##return) {
// #c2 はトレイル文字になりえないため、
// #c1 はトレイル文字であることが確定。
#is_2byte_char = 1;
} else {
call IsCharLeadByte char(midstr($s, #len - 3, 1));
if (!##return) {
// 最後から3バイト目の文字がリード文字
// ではないことから、#c2 がトレイル文字
// でないことが確定し、
// #c1 がトレイル文字であることが
// 確定する。
#is_2byte_char = 1;
}
// 最後から3バイト目の文字がリード文字に
// なりうる文字の場合、#c2 が1バイト文字では
// ありえないことから #c2 がトレイル文字である
// ことが確定し、#c1 が1バイト文字であることが
// 確定する。
}
}
}
}
}
}
// 文字種を返すサブルーチン群:
// リード文字になりうる文字かどうかを返す
IsCharLeadByte:
return (##1 >= 0x81 && ##1 <= 0x9F) ||
(##1 >= 0xE0 && ##1 <= 0xFC);
// トレイル文字になりうる文字かどうかを返す
IsCharTrailByte:
return (##1 >= 0x40 && ##1 <= 0xFC && ##1 != 0x7F);
// 1バイト文字になりうるかどうかを返す
// なお、IsCharLeadByte と IsCharOneByteStuff が
// 同一文字コードに対してともに 1 を返すことはない
IsCharOneByteStuff:
return (##1 >= 0x0 && ##1 <= 0x7E) ||
(##1 >= 0xA1 && ##1 <= DF);
|
|