« 【講座】HSPよく使うフレーズ 第30回 ペイントソフト(2) | メイン | 【よみもの】もーりおのつぶやき 第9回 »

2007年05月15日

【講座】「教えて!おにたま!!」

おにたまさま いつもお世話になります。

以前hsp3の掲示板で
Unicode文字列の長さを取得するのに、APIのlstrlenを使って

#uselib "kernel32.dll"
#cfunc lstrlenW "lstrlenW" var
a = "" : cnvstow a, "abcあいうdef"
mes lstrlenW(a)

と教えられたのですが
別の方にべつにAPIを使わなくても標準命令だけでもできると
言われました。
できればそれにこしたことはないと思ったんですが・・
hspの最新版を使わせていただいていますが
いろいろ探してもUnicodeに関しては"cnvstow","cnvwtos"しか
見つからず古いバージョンでは"llmod.as"、"unicode.as"を
includeして"to_uni""from_uni"という命令が使えるようですが
hsp3ではどうすれば標準命令だけでUnicode文字列の長さを
取得することができるのかわかりません
どこへ行っても教えていただくばかりで恐縮ですが
ご教授お願いできますでしょうか?

<こたえ>

お便りありがとうございます。なかなか高度な質問ですね。
よくわからない人も多いと思いますので、Unicodeとは何かを
簡単に説明しておきましょう。
HSPで文字列を扱う場合には、半角1byte、全角2byteで表わす
シフトJIS(SJIS)というルールが採用されています。
これについては、マニュアルと一緒に同梱されている
「HSP3文字列のひみつ(hsp3str.htm)」という文書でも解説して
います。
コンピューターは、どんな文字列であっても最終的には
1byte=8bit(0~255までの値)のデータとして記憶しています。
しかし、開発環境やOSごとに文字列を表わすルールが色々あって
何かと不便な状態になっています。国ごとに話す言葉が違う
ように、文字列のデータもソフトごとに異なっていると考えて
もらって構いません。
HSP2やHSP3では、日本の古いパソコン時代から採用されている
ルール(SJIS)になっていますが、Visual BasicやJavaを始めと
した最近の言語では、国際的に規格が統一されているUnicode
(またはUTF-16とも呼ばれます)が多く採用されています。
HSP3では、これらの橋渡しをするために、Unicodeとの相互
変換命令(cnvstow、cnvwtos)を標準でサポートしていますが、
strlenやstrmidなど文字列を扱う命令や関数の多くは、
Unicodeを扱うことができません。
UnicodeがSJISと異なっている最大のポイントは、1つの文字を
2byteで表わすという部分です。半角、全角という区別はなく、
すべての文字は2byte(0~65535までの値)で管理されます。
データ領域を余計に使う反面、大量の文字種をシンプルに扱う
ことができます。
APIのlstrlenWは、この2byte単位の文字列の長さを数える関数
ですが、これと同じことをHSPの標準命令で行なうとすると、
以下のようになります。

sdim a,64
cnvstow a, "abcあいうdef"

repeat
if wpeek(a,cnt*2)=0 : len=cnt : break
loop

mes "LEN="+len

残念ながら、一回の処理でUnicodeの長さを調べる命令や
関数は、HSP3にありません。ですから、APIのlstrlenWを
使用すること自体に問題はないと思われます。

日本語を含む文字列データの扱いについては、色々と複雑な
部分もありますが、昔からの積み重ねで現在の形になってきて
います。あせらずじっくりと覚えていってください。
それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 2007年05月15日 01:05

口臭チェッカー市場