【質問】chr$での文字表示について

 投稿日:2008年 9月 2日(火)04時49分9秒
  ※現在の住まいの関係上、無料メールしか利用できないため
※こちらの掲示板に書かせていただきます。

当方、WindowsXp + 十進BASIC 7.2.7という環境です。
前に十進BASICとUltraBASICの違いを質問した者です、よろしくお願いします。

 print chr$(...)

て具合に番地指定で文字表示させる際に
WindowsのIMEパッドで見える範囲を指定してるのにちょくちょく例外が発生します。

=ここから=
option character kanji
input prompt "全角で1文字入力してください:":a$
let b=ord(a$)
let b$=str$(b)
let c$=bstr$(ord(a$),16)
let d$=right$(c$,2)&left$(c$,2)
print
print chr$(bval(c$,16))&"(JIS:"&c$&")"&" -> "&chr$(bval(d$,16))&"(JIS:"&d$&")"
end
=ここまで=

例として、上記プログラムでa$に「日」と入力した場合に出力される文字を
テキストウィンドウ内でコピーしてからプログラムを再実行して
2回目のa$入力でペーストすれば「裏の裏は表」となり、今度は「日」が出力されるはずだと思うのですが
なぜかここで例外4002が発生してしまいます。

当方の記述にまずい点があればご教示いただけませんでしょうか。
それともFull Basicの規格に準拠する仕様上、当然の結果なのでしょうか?
 

Re: 【質問】chr$での文字表示について

 投稿者:SECOND  投稿日:2008年 9月 2日(火)22時32分26秒
  > No.3[元記事へ]

削除編集できません。→ 投稿者:SECOND  投稿日:2008年 9月 2日(火)21時28分28秒
削除して下さい。


win98SE + ver7.2.7 では、例外が発生せず、以下の様に
期待どうりになります。
しかし、byte 反転した word は、漢字コードの許される範囲を、
いつ飛出すか不明です。時折、不正コードは、発生しているはずです。
又、7C46 は、第1第2水準以外の、拡張文字コードです。
  (金+帝 の字、※この掲示板は、表示出来ないようです。)
IMEパッドも、アテニ出来ません。
この字を、IMEパッドで拾うと何故か、BSTR$( ORD("金+帝"),16 ) →"1662" になる?不正コードです。
しかし、w$=CHR$( BVAL("7C46",16) ) →BSTR$( ORD(w$),16 ) →"7C46" になりますので、
十進BASIC の方は、正常です。


全角で1文字入力してください:日

日(JIS:467C) -> (JIS:7C46)

  (copy & paste)

全角で1文字入力してください:

(JIS:7C46) -> 日(JIS:467C)
 

Re: 【質問】chr$での文字表示について

 投稿者:Bear  投稿日:2008年 9月 3日(水)21時10分48秒
  > No.5[元記事へ]

ありがとうございます。
IMEパッドもあてにできないんですね、今後は注意するようにします。

>win98SE + ver7.2.7 では、例外が発生せず、以下の様に
>期待どうりになります。
やっぱりそうですか。
自分も前に 98SE + 5.0.8 の組合せで同じ事を試した時は
第1水準、第2水準から外れる文字番地をかすめても特に支障なかったので
これはありなんだと思ってたら今回 Xp + 7.2.7 で例外を回避できませんでした。

猶、例外が出る文字番地を一覧するもの書いてみました。
=ここから=
rem -- 全角文字の始点:8481 (2121) / 終端:38700 (972C) --
rem -- 結果出力は画面表示よりファイルに書き出した方が早いかも --
option arithmetic decimal
option character kanji
do
input prompt "どこから見る?(半角始点=1,全角始点=2)":start
if start=1 or start=2 then
exit do
elseif start=0 then
stop
else
end if
loop
select case start
case is =2
let start=8481
case else
end select
for count=start to 38700 step 1
let hcount$=bstr$(count,16)
let strcount$=str$(count)
when exception in
print chr$(39)+chr$(count)+chr$(39)+" chr$("+strcount$+") <-> JIS ["+hcount$+"]"
use
print chr$(7)+"例外"+str$(extype)+chr$(7)+" chr$("+strcount$+") <-> JIS ["+hcount$+"]"
end when
next count
end
=ここまで=
 

Re: 【質問】chr$での文字表示について

 投稿日:2008年 9月 5日(金)20時59分34秒
  > No.6[元記事へ]

Windows XP (Windows2000) は文字コードがユニコードに変更されています。
シフトJISの文字はユニコードに変換されて表示されます。
シフトJISとJISの対応は,一応,一対一とみなせますが,
ユニコードとJIS(あるいはシフトJIS)との対応は一対一ではありません。
シフトJIS→ユニコード→シフトJISと変換すると元に戻らないことがあります。
十進BASICの場合,ファイル入出力はシフトJISなので,
画面に表示した文字をクリップボード経由で取り出すのでなく,
ファイルに書き出した文字を対象にすれば,問題は起こりにくくなると思います。


100 OPTION CHARACTER KANJI
110 INPUT PROMPT "全角で1文字入力してください:":a$
120 LET b=ORD(a$)
130 LET b$=STR$(b)
140 LET c$=BSTR$(ORD(a$),16)
150 LET d$=right$(c$,2)&left$(c$,2)
160 PRINT
170 PRINT CHR$(BVAL(c$,16))&"(JIS:"&c$&")"&" -> "&CHR$(BVAL(d$,16))&"(JIS:"&d$&")"
180 OPEN #1:NAME "A:TEST.TXT"
190 ERASE #1
200 PRINT #1:CHR$(BVAL(d$,16))
210 CLOSE #1
220 OPEN #2:NAME "A:TEST.TXT"
230 INPUT #2:s$
240 CLOSE #2
250 PRINT BSTR$(ORD(s$),16)
260 END

180行以降を追加しています。
 

Re: 【質問】chr$での文字表示について

 投稿日:2008年 9月 6日(土)10時09分11秒
  > No.6[元記事へ]

JIS文字コードは,第2バイト(下位バイト)が16進で21から7Eの間でのみ定義されています。
なので,文字を順に生成するプログラムは,下位バイトが21から7Eの間になるように記述しなければなりません。


100 OPTION ARITHMETIC DECIMAL
110 OPTION CHARACTER KANJI
120 FOR hi=BVAL("21",16) TO BVAL("73",16)
130    FOR lo=BVAL("21",16) TO BVAL("7E",16)
140       LET count=hi*256+lo
150       LET hcount$=BSTR$(count,16)
160       LET strcount$=STR$(count)
170       WHEN EXCEPTION IN
180          PRINT CHR$(39)&CHR$(count)&CHR$(39)&" chr$("&strcount$&") <-> JIS ["&hcount$&"]"
190       USE
200          PRINT CHR$(7)&"例外"&STR$(EXTYPE)&CHR$(7)&" chr$("&strcount$&") <-> JIS ["&hcount$&"]"
210       END WHEN
220    NEXT lo
230 NEXT hi
240 END
 

Re: 【質問】chr$での文字表示について

 投稿者:Bear  投稿日:2008年 9月 7日(日)22時07分8秒
  白石先生、ありがとうございます。

提示いただいたソース拝見しました、自分でも動かしてみました。
なるほど、こうすればいいんですね。
今後の参考にさせていただき、もっと勉強しようと思います。

>シフトJIS→ユニコード→シフトJISと変換すると元に戻らないことがあります。

文字の割当てがない番地(「・」と表示されるところ)を
WindowsXp上でコピーしてからペースト(クリップボード経由)すると
本来の番地に関係なくJIS 2126番地にされてしまいます。
この現象はWindows98SEでは見られないものでしたが、これで疑問が晴れました。

ありがとうございました。
 

戻る